概述

## 登录 ### 统一身份认证 首先要将用户引导到以下 URL: ``` https://ucenter.example.com/oauth/authorize ?client_id=jhbbs &redirect_uri=https://bbs.example.com/callback &response_type=code &scope=read-basic-user-data &state=abcdabcd ``` 服务器将会以此进行以下处理: - 验证请求是否合法 - 验证是否登录(Session),跳转到登录 - 如果请求来自登录页面,则提交登录操作(维护 Session) - 验证是否有未经授权的权限,如有则跳转到授权 - 如果请求来自授权页面,则提交授权操作(用户允许或拒绝的结果) 上述步骤都通过以后,认证服务器使用 HTTP 302 跳转到回调地址,并附上授权码: ``` https://bbs.example.com/callback?code=xxxxxx&state=abcdabcd ``` 应用服务器拿到 code 之后,去请求 Access Token,发起如下请求: ``` https://ucenter.example.com/oauth/token ?client_id=jhbbs &client_secret=password &grant_type=authorization_code &code=xxxxxx &redirect_uri=https://bbs.example.com/login &scope=read-basic-user-data &state=efghefgh ``` 后端经过验证后返回 Token 数据: ```json { "access_token": "sdjaklsfjksaldsadjsakl", "refresh_token": "2312ujsafklsajlweioszv", "token_type": "Bearer", "expires_in": 2333 } ``` 应用服务器会缓存这个 Token 以便下一次查询,应用前端如有必要也可以保存 Token 以便后续查询。 Access Token 有一定的有效期,过期后需要通过 Refresh Token 进行刷新,如果后者也过期,则请求重新获取授权码。 整个过程中,认证部分需要维护三张数据表: - oauth_client_details:存放回调地址,授权信息,是否信任,权限信息等 - oauth_code:存放发放给客户端应用的 code,使用后失效,已保证其安全性 - oauth_access_token:存放用户信息、客户端和 Token 的对应关系