这个过程主要涉及OAuth 2.0 授权协议,是当前行业标准的安全授权方式,其核心思想是:用户通过你的应用登录快手,授权你的应用访问其某些数据(如用户信息、发布视频等),然后快手会返回一个 Access Token(访问令牌),你的后续所有 API 请求都需要携带这个 token 来证明身份。


核心概念

在开始之前,先理解几个关键术语:

  1. 应用凭证:你在快手开放平台创建应用后获得的App IDApp Secret,这是你的应用在快手平台的“身份证”。
  2. 授权码:用户同意授权后,快手服务器重定向回你的回调地址时附带的一个一次性的临时凭证。
  3. Access Token (访问令牌):你通过授权码和 App Secret 换取到的核心凭证,它有一定的有效期(90 天),用于调用快手 API。
  4. Refresh Token (刷新令牌):当 Access Token 过期后,使用它和 App Secret 可以申请新的 Access Token,而无需用户重新授权。
  5. 回调地址:用户授权后,快手会把浏览器重定向到这个 URL。这个地址必须在快手开放平台的应用配置中预先设置好

获取 Token 的完整流程(标准 OAuth 2.0 授权码模式)

这个过程分两步:获取授权码用授权码换取 Access Token

第一步:获取授权码

这一步的目标是引导用户到快手登录页面,并让他同意授权。

在快手开放平台创建应用

  • 登录 快手开放平台
  • 进入“开发者中心” -> “应用管理” -> “创建应用”。
  • 选择应用类型(网站应用”或“移动应用”)。
  • 填写应用信息,包括应用名称、简介、网站/应用域名等。
  • 关键步骤:在应用详情页,找到“授权回调域”或“回调地址”的配置项,并填入你的应用能够接收回调的 URL(https://www.yourdomain.com/auth/callback),这个 URL 必须是公网可访问的,并且与你在后续请求中使用的 redirect_uri 参数完全一致。
  • 创建成功后,记录下你的 App IDApp 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_uristate 需要经过 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 中提取出 codestate,并验证 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_tokenrefresh_tokenexpires_in 可以用来设置 token 的过期提醒。


重要注意事项

  1. 安全性

    • client_secret 必须保密:它相当于你应用的密码,绝不能放在前端 JavaScript 代码中,也不能通过不安全的方式传输,你的后端服务器应该负责处理所有与 Token 交换相关的请求。
    • access_token 同样需要保密:它代表了用户对你的授权,泄露可能导致用户数据泄露或恶意操作。
    • 使用 HTTPS:整个授权流程,特别是回调地址和你的后端接口,都必须使用 https 协议,防止数据在传输过程中被窃听。
  2. 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 也过期时,才需要引导用户重新走一遍授权流程。
  3. 错误处理

    • 在你的代码中,必须妥善处理所有可能的错误,如网络错误、无效的 code、用户拒绝授权、scope 错误等,并向用户友好的提示。

总结流程图

graph TD
    A[你的应用] --> B[构造授权URL];
    B --> C[用户点击/跳转];
    C --> D[快手登录/授权页面];
    D --> E{用户是否同意?};
    E -- 同意 --> F[快手重定向到你的回调地址, 并带上code];
    E -- 拒