一、OAuth2.0流程
- (A)客户端向从资源所有者请求授权。
- (B)客户端收到授权许可,资源所有者给客户端颁发授权许可(比如授权码code)
- (C)客户端与授权服务器进行身份认证并出示授权许可(比如授权码code)请求访问令牌。
- (D)授权服务器验证客户端身份并验证授权许可,若有效则颁发访问令牌(accept token)。
- (E)客户端从资源服务器请求受保护资源并出示访问令牌(accept token)进行身份验证。
- (F)资源服务器验证访问令牌(accept token),若有效则满足该请求。
二、OAuth2.0授权模式
OAuth2.0有4种授权模式:
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
三、授权码模式(authorization code)
角色解释:
- 资源所有者(Resource Owner): 能够许可受保护资源访问权限的实体。当资源所有者是个人时,它作为最终用户被提及。(理解为终端用户)
- 用户代理(User Agent): 指的的资源拥有者授权的一些渠道。一般指的是浏览器、APP。(理解为浏览器)
- 客户端(Client): 使用资源所有者的授权代表资源所有者发起对受保护资源的请求的应用程序。术语“客户端”并非特指任何特定的的实现特点(例如:应用程序是否在服务器、台式机或其他设备上执行)。(理解为后端服务器)
- 授权服务器(Authorization Server): 在成功验证资源所有者且获得授权后颁发访问令牌给客户端的服务器。
授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以和资源服务器是同一台服务器,也可以是分离的个体。一个授权服务器可以颁发被多个资源服务器接受的访问令牌。(比如 Google、GitHub、微信等三方服务) - 资源服务器(Resource Server): 托管受保护资源的服务器,能够接收和响应使用访问令牌对受保护资源的请求。
流程解释:
- [A] 用户访问客户端,后者将前者导向认证服务器。
- [B] 用户选择是否给予客户端授权。
- [C] 假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
- [D] 客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
- [E] 认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
四、 Google 三方授权码模式代码实现
1. 创建 Google 凭据
- 访问Google Cloud Console,登录Google账户。
- 创建新项目:点击“创建项目”,输入项目名称,然后创建项目。
- 启用Google+ API:虽然现在Google+不再存在,但你需要找到相应的API(如“Google People API”)来管理用户信息和认证。
- 创建OAuth 2.0客户端ID:
- 导航到“凭据”部分。
- 点击“创建凭据” > “OAuth客户端ID”。
- 选择应用类型(例如,“Web应用”),并输入你的应用名称。
- 添加重定向URI,这应该包括你的应用将在用户授权后接收响应的URL。如果你的应用有多个重定向需求,比如开发环境和生产环境,都需要在这里列出。在这个场景中,你需要添加/google-callback.json作为重定向URI。
- 获取客户端ID和密钥:创建完客户端ID后,你会获得一个客户端ID和客户端密钥,这些是你在应用中进行Google登录认证时需要使用的凭据。
2. 代码实现
1. 用户点击 Google 登录
客户端请求服务端获取三方登录地址,服务端返回地址:
https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?scope=openid email profile&include_granted_scopes=true&response_type=code&state=服务端生成唯一code&redirect_uri=https://xxx/google-callback.json&client_id=xxx&flowName=GeneralOAuthFlow&prompt=consent&service=lso&o2v=2&ddm=0
- state:服务端生成的唯一 state,三方平台回调时会回传,state 可以确定请求用户
- redirect_uri:三方回调地址,三方平台会在浏览器上302 重定向到这个地址
2. 用户确认授权
3. Google 回调
回调地址:https://xxx/google-callback.json?state=xxx&code=xxx&scope=email+profile+openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&authuser=0&prompt=consent
- state:服务端生成的唯一 state,Google 回调会原样传回来,用state 可以确定请求用户
- code:根据 code 可以换取 token
4. 换取 token
5. 获取用户信息
拿到 token 以后可以获取到用户信息