这个过程主要涉及OAuth 2.0 授权协议,是当前行业标准的安全授权方式,其核心思想是:用户通过你的应用登录快手,授权你的应用访问其某些数据(如用户信息、发布视频等),然后快手会返回一个 Access Token(访问令牌),你的后续所有 API 请求都需要携带这个 token 来证明身份。
核心概念
在开始之前,先理解几个关键术语:
- 应用凭证:你在快手开放平台创建应用后获得的App ID 和 App Secret,这是你的应用在快手平台的“身份证”。
- 授权码:用户同意授权后,快手服务器重定向回你的回调地址时附带的一个一次性的临时凭证。
- Access Token (访问令牌):你通过授权码和 App Secret 换取到的核心凭证,它有一定的有效期(90 天),用于调用快手 API。
- Refresh Token (刷新令牌):当 Access Token 过期后,使用它和 App Secret 可以申请新的 Access Token,而无需用户重新授权。
- 回调地址:用户授权后,快手会把浏览器重定向到这个 URL。这个地址必须在快手开放平台的应用配置中预先设置好。
获取 Token 的完整流程(标准 OAuth 2.0 授权码模式)
这个过程分两步:获取授权码 和 用授权码换取 Access Token。
第一步:获取授权码
这一步的目标是引导用户到快手登录页面,并让他同意授权。
在快手开放平台创建应用
- 登录 快手开放平台。
- 进入“开发者中心” -> “应用管理” -> “创建应用”。
- 选择应用类型(网站应用”或“移动应用”)。
- 填写应用信息,包括应用名称、简介、网站/应用域名等。
- 关键步骤:在应用详情页,找到“授权回调域”或“回调地址”的配置项,并填入你的应用能够接收回调的 URL(
https://www.yourdomain.com/auth/callback),这个 URL 必须是公网可访问的,并且与你在后续请求中使用的redirect_uri参数完全一致。 - 创建成功后,记录下你的 App ID 和 App Secret。
构造授权 URL 并引导用户跳转
你需要构造一个 URL,让用户点击后跳转到快手授权页面。
URL 格式:
https://open.kuaishou.com/oauth/authorize?
response_type=code&
client_id=你的APP_ID&
redirect_uri=你的回调地址&
state=一个随机字符串&
scope=需要的权限范围
参数详解:
response_type: 固定为code,表示使用授权码模式。client_id: 必填,你的 App ID。redirect_uri: 必填,你在快手开放平台配置的回调地址。必须进行 URL 编码。state: 强烈建议填写,一个你生成的随机字符串(a1b2c3d4),用于防止 CSRF 攻击,在回调时快手会原样返回这个值,你需要验证它是否匹配。scope: 可选,指定你需要的权限,多个权限用逗号()隔开。user_info: 获取用户公开信息(如昵称、头像)。share: 发布/删除视频等分享权限。moment: 获取用户动态信息等。- 如果不填,默认只有基础权限,建议只请求你实际需要的权限,以提升用户授权通过率。
示例:
假设你的 App ID 是 test_client_id,回调地址是 https://www.yourdomain.com/auth/callback,生成的 state 是 xyz123,你需要 user_info 权限。
构造出的 URL 可能是这样的(注意 redirect_uri 和 state 需要经过 URL 编码):
https://open.kuaishou.com/oauth/authorize?
response_type=code&
client_id=test_client_id&
redirect_uri=https%3A%2F%2Fwww.yourdomain.com%2Fauth%2Fcallback&
state=xyz123&
scope=user_info
用户操作: 用户访问这个 URL 后,会看到快手登录页面,登录后,会看到一个授权页面,询问“是否允许 [你的应用名称] 访问你的 [用户信息]?”。
- 如果用户同意,快手会重定向到你的
redirect_uri,并附带一个code参数,https://www.yourdomain.com/auth/callback?code=AUTHORIZATION_CODE_HERE&state=xyz123 - 如果用户拒绝,可能会附带错误信息。
你的任务: 从重定向的 URL 中提取出 code 和 state,并验证 state 是否与你之前发送的一致,如果一致,则 code 是有效的。
第二步:用授权码换取 Access Token
现在你手上有了有效的 code,就可以用它来换取 Access Token。
发送 HTTP POST 请求
你需要向快手指定的 Token 接口发送一个 POST 请求。
请求 URL:
https://open.kuaishou.com/oauth/token
请求方法:
POST
请求头:
Content-Type: application/x-www-form-urlencoded
请求体 (Form Data):
grant_type=authorization_code&
code=你在上一步获取的AUTHORIZATION_CODE&
client_id=你的APP_ID&
client_secret=你的APP_SECRET&
redirect_uri=你的回调地址
参数详解:
grant_type: 固定为authorization_code。code: 必填,上一步获取的授权码。client_id: 必填,你的 App ID。client_secret: 必填,你的 App Secret。这个参数非常敏感,千万不要泄露给任何人,也不要在前端代码中暴露!redirect_uri: 必填,必须与第一步中使用的redirect_uri完全一致。
解析响应
如果请求成功,快手会返回一个 JSON 格式的响应,包含 Access Token 和其他信息。
成功响应示例 (HTTP 200 OK):
{
"access_token": "ACCESS_TOKEN_STRING",
"refresh_token": "REFRESH_TOKEN_STRING",
"expires_in": 7776000, // token有效期,单位是秒(例如90天)
"uid": "KUAISHOU_USER_ID", // 快手用户的唯一ID
"scope": "user_info"
}
失败响应示例 (code 无效):
{
"error": "invalid_grant",
"error_description": "Authorization code is invalid or expired."
}
你的任务: 从成功的响应中提取并安全地存储 access_token 和 refresh_token。expires_in 可以用来设置 token 的过期提醒。
重要注意事项
-
安全性:
client_secret必须保密:它相当于你应用的密码,绝不能放在前端 JavaScript 代码中,也不能通过不安全的方式传输,你的后端服务器应该负责处理所有与 Token 交换相关的请求。access_token同样需要保密:它代表了用户对你的授权,泄露可能导致用户数据泄露或恶意操作。- 使用 HTTPS:整个授权流程,特别是回调地址和你的后端接口,都必须使用
https协议,防止数据在传输过程中被窃听。
-
Token 刷新:
access_token会过期,当它过期时,不要让用户重新授权。- 使用
refresh_token向快手服务器发送一个 POST 请求来获取新的access_token。 - 刷新请求 URL:
https://open.kuaishou.com/oauth/token - 请求体:
grant_type=refresh_token& refresh_token=你的REFRESH_TOKEN& client_id=你的APP_ID& client_secret=你的APP_SECRET - 当
refresh_token也过期时,才需要引导用户重新走一遍授权流程。
-
错误处理:
- 在你的代码中,必须妥善处理所有可能的错误,如网络错误、无效的
code、用户拒绝授权、scope错误等,并向用户友好的提示。
- 在你的代码中,必须妥善处理所有可能的错误,如网络错误、无效的
总结流程图
graph TD
A[你的应用] --> B[构造授权URL];
B --> C[用户点击/跳转];
C --> D[快手登录/授权页面];
D --> E{用户是否同意?};
E -- 同意 --> F[快手重定向到你的回调地址, 并带上code];
E -- 拒 