概述
## 登录
### 统一身份认证
首先要将用户引导到以下 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 的对应关系