授权码模式
授权码模式(Authorization Code Grant)是 OAuth 2.0 中最安全且常用的授权流程之一,主要用于当客户端应用需要访问由资源所有者控制并托管在资源服务器上的受保护资源时。这种模式特别适合那些拥有后端服务器的应用程序,因为它允许通过后端交换敏感信息(如授权码和访问令牌),从而避免了在用户设备上直接处理这些信息的风险。
授权码模式的工作流程
以下是授权码模式的基本工作流程:
客户端重定向用户至授权服务器:
- 客户端构造一个请求 URL,并将用户代理(通常是浏览器)重定向到该 URL。这个 URL 包含了客户端的 ID、重定向 URI、请求的权限范围(scope)、状态参数(用于防止 CSRF 攻击)等信息。
- 用户被引导到授权服务器登录页面,并提示是否同意授予客户端请求的权限。
用户同意授权:
- 如果用户同意授权,授权服务器会将用户代理重定向回客户端指定的重定向 URI,并附带一个授权码作为查询参数。
客户端用授权码交换访问令牌:
- 客户端(其后端部分)使用收到的授权码向授权服务器发起请求,以交换访问令牌(access token)和刷新令牌(refresh token)。这一步骤通常涉及发送客户端 ID、客户端密钥、授权码以及重定向 URI。
- 请求必须经过服务端到服务端的安全通道进行,以确保授权码不会暴露给可能存在的中间人攻击。
授权服务器响应:
- 如果请求成功,授权服务器将以 JSON 格式返回一个响应,其中至少包含访问令牌和可选的刷新令牌、令牌类型及有效期等信息。
客户端使用访问令牌访问资源:
- 客户端收到访问令牌后,可以在后续的 API 请求中通过 HTTP 头部添加
Authorization: Bearer <access_token>的方式来访问资源服务器上的受保护资源。
- 客户端收到访问令牌后,可以在后续的 API 请求中通过 HTTP 头部添加
示例请求
假设有一个 Web 应用想要代表用户访问其 Google 账户中的某些数据,可以按照以下步骤操作:
将用户重定向至如下 URL:
https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&scope=email&state=STATE_STRING用户登录并同意授权后,Google 会将用户代理重定向回你的应用,并附带授权码:
YOUR_REDIRECT_URI?code=AUTHORIZATION_CODE&state=STATE_STRING应用的后端使用收到的授权码向 Google 的令牌端点发起 POST 请求来获取访问令牌:
httpPOST /oauth2/v4/token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=AUTHORIZATION_CODE&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&redirect_uri=YOUR_REDIRECT_URI&grant_type=authorization_codeGoogle 响应包括访问令牌和其他相关信息:
json{ "access_token": "ACCESS_TOKEN", "expires_in": 3920, "token_type": "Bearer", "refresh_token": "REFRESH_TOKEN" }
通过上述流程,授权码模式提供了一种既方便又安全的方法,让客户端应用能够代表用户访问受保护资源,同时最小化了用户凭据泄露的风险。