Appearance
OAuth 2.0 授权码模式
1. 角色介绍
- 资源所有者(Resource Owner):通常是用户,拥有和控制资源;
- 客户端(Client):需要访问资源的应用。以 Web 应用为例,则 Client 包括前端浏览器和后端接口;
- 授权服务器(Authorization Server):提供 OAuth 2.0 认证和授权的服务器;
- 资源服务器(Resource Server):存放用户资源的服务器,支持 OAuth 2.0 协议(可与授权服务器为同一个系统);
2. 详细流程
用户请求访问资源
用户在客户端应用中请求访问受保护资源,例如访问个人资料或读取数据。
客户端重定向用户到授权服务器
客户端应用将用户重定向到授权服务器,并传递以下参数:
- response_type:设为
code,表示请求授权码; - client_id:客户端应用在授权服务器注册时获得的 ID;
- redirect_uri:授权码生成后要重定向到的 URI;
- scope:请求的权限范围,例如
read或write; - state:一个防止 CSRF 攻击的随机字符串;
- response_type:设为
用户登录并授权
用户在授权服务器上登录并查看客户端请求的权限范围,决定是否授权。如果用户同意授权,授权服务器将生成一个授权码。
授权服务器重定向回客户端
授权服务器将用户重定向回客户端指定的
redirect_uri,并在 URL 中附带以下参数:- code:生成的授权码;
- state:和请求时一致,用于防止 CSRF 攻击;
客户端用授权码请求访问令牌
客户端从 URL 中提取授权码后,将其与客户端凭证一同发送到授权服务器的令牌端点,申请访问令牌。请求中包括:
- grant_type:设为
authorization_code; - code:从重定向中获取的授权码;
- redirect_uri:必须与申请授权码时的
redirect_uri一致; - client_id 和 client_secret:客户端的身份凭证(在注册时获得);
为什么不直接返回
access_token和refresh_token?OAuth 2.0 授权码模式通常用于用户通过客户端(如浏览器)访问服务。用户在浏览器中被重定向到授权服务器登录并授权,登录完成后重定向回客户端的
redirect_uri,并附带授权码。如果直接返回
access_token或refresh_token,这些敏感令牌会通过用户的浏览器直接传递,有被劫持、窃听的风险。而授权码模式将访问令牌的交换过程限制在客户端的服务器端,减少了令牌泄露的风险。- grant_type:设为
授权服务器返回访问令牌和刷新令牌
授权服务器验证授权码和客户端信息。如果验证成功,返回包含以下信息的 JSON 响应:
- access_token:访问令牌,用于访问受保护资源;
- token_type:令牌类型(通常是
Bearer); - expires_in:访问令牌的有效期(秒);
- refresh_token:刷新令牌,用于获取新的访问令牌;
客户端使用访问令牌请求资源
客户端携带访问令牌向资源服务器请求资源。请求的 HTTP 头部包含以下内容:
- Authorization:包含访问令牌,格式为
Bearer ACCESS_TOKEN;
- Authorization:包含访问令牌,格式为
资源服务器返回资源数据
资源服务器验证访问令牌的有效性。如果令牌有效,则返回用户请求的资源数据;否则,返回错误信息。
3. 刷新令牌
如果访问令牌过期,客户端可以使用 refresh_token 向授权服务器请求新的访问令牌,而不需要用户再次授权。刷新令牌的请求包括:
- grant_type:设为
refresh_token; - refresh_token:用于刷新访问令牌的令牌;
- client_id 和 client_secret;
授权服务器返回新的访问令牌。