🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **第一种授权方式:授权码** **授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。** 这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。 **第一步**,A 网站提供一个链接,用户点击后就会跳转到 B 网站,授权用户数据给 A 网站使用。下面就是 A 网站跳转 B 网站的一个示意链接。 ~~~javascript https://b.com/oauth/authorize?response_type=code &client_id=CLIENT_ID &redirect_uri=CALLBACK_URL &scope=read ~~~ 上面 URL 中,`response_type`参数表示要求返回授权码(`code`),`client_id`参数让 B 知道是谁在请求,`redirect_uri`参数是 B 接受或拒绝请求后的跳转网址,`scope`参数表示要求的授权范围(这里是只读)。 **第二步**,用户跳转后,B 网站会要求用户登录,然后询问是否同意给予 A 网站授权。用户表示同意,这时 B 网站就会跳回`redirect_uri`参数指定的网址。跳转时,会传回一个授权码,就像下面这样。 ``` https://a.com/callback?code=AUTHORIZATION_CODE ``` ![](https://img.kancloud.cn/2b/94/2b941de75058122c6e8b1516c685e1cf_800x450.png) 第三步,A 网站拿到授权码以后,就可以在后端,向 B 网站请求令牌 ``` https://b.com/oauth/token?client_id=CLIENT_ID &client_secret=CLIENT_SECRET &grant_type=authorization_code &code=AUTHORIZATION_CODE &redirect_uri=CALLBACK_URL ``` 上面 URL 中,`client_id`参数和`client_secret`参数用来让 B 确认 A 的身份(`client_secret`参数是保密的,因此只能在后端发请求),`grant_type`参数的值是`AUTHORIZATION_CODE`,表示采用的授权方式是授权码,`code`参数是上一步拿到的授权码,`redirect_uri`参数是令牌颁发后的回调网址。 ![](https://img.kancloud.cn/77/ac/77ac6fa68d51da782605c7e67a03feee_800x450.png) 第四步,B 网站收到请求以后,就会颁发令牌。具体做法是向`redirect_uri`指定的网址,发送一段 JSON 数据。 ``` { "access_token":"ACCESS_TOKEN", "token_type":"bearer", "expires_in":2592000, "refresh_token":"REFRESH_TOKEN", "scope":"read", "uid":100101, "info":{...} } ``` 上面 JSON 数据中,`access_token`字段就是令牌,A 网站在后端拿到了。 ![](https://img.kancloud.cn/c5/f0/c5f063ce6ff13735f0ef05f44a6c93fe_800x450.png)