写在前面:
在前一篇博客《OAuth2.0 原理简介》中我们已经了解了OAuth2.0的原理以及它是如何工作的,那么本篇我们将来聊一聊OAuth的一种授权许可方式:授权码(Authorization Code)
什么是Authorization Code ?
简单来说授权码就是的在第三方应用程序请求Authrization Server来获取AccessToken之前的预先校验,增加了获取token的安全性。比如你吭哧吭哧写了一天的代码,急于回家吃上一口媳妇做的热饭。当你走到小区门口的时候你需要刷卡才能进入到小区,然后找到你家在哪一栋楼,几单元几号,然后掏出钥匙开门,才能回到家。在这个过程中授权码就相当于是你在用钥匙开门回家的前一步身份确认,如果你不是这个小区的,那你自然是没有办法进入到小区内部的。授权码方式是OAuth2.0最常用的一种授权方式,比如:QQ,豆瓣,新浪微博等用的都是这种方式。
授权码的工作流程解析
上图的流程表示了请求的全过程,需要注意的点是:
发起授权请求需要的参数如下:
对应步骤(C),客户端向Authorization Server发起请求的时候需要提供以下参数:
- response_type:必选。值固定为“code”。
- client_id:必选参数(第三方应用的标识ID,告诉服务器谁需要得到授权)
- state:Client提供的一个字符串,服务器会原样返回给Client。
- redirect_uri:必选参数(授权成功后的重定向地址)
- scope:可选参数(表示授权范围)
完整URL如下所示:
GET /authorize?response_type=code&client_id=1&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Foauth2&scope=user,photo HTTP/1.1
Host: server.example.com
得到授权返回数据如下:
对应上图中的步骤(E),A授权服务器会返回下面信息:
- code:授权码(用于的下一步中请求token使用)
- state:步骤(C)中客户端提供的state参数原样返回。
完整的URL如下:
Location: https://client.example.com/oauth2?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
发起获取token的请求参数如下:
对应步骤(G):
- grant_type:必选参数(固定值“authorization_code”)
- code : 必选参数(上一步Response 中响应的code,避免在请求的过程中被篡改)
- redirect_uri:必选参数(必须和Request中提供的redirect_uri相同)
- client_id:必选参数(必须和上一步Request中提供的client_id相同,不能token和授权码请求的第三方应用不一致)
得到token的response包含如下信息:
对应步骤(H):
- access_token:访问令牌(服务器端加密过的字符串)。
- refresh_token:刷新令牌(刷新令牌的字符串)
- expires_in:过期时间(令牌的过期时间)
{
"access_token":"MJhjskotnFZFEjr1zCsicHJKSLA",
"token_type":"granttype",
"expires_in":4800,
"refresh_token":"JHJhjasdsjhKNSGKmzHDK",
"example_parameter":"example_value_test"
}
如果有一天你的小区的钥匙被一个陌生人拿到了,那么他就可以名正言顺的进入的小区里面,那么他进入到你家的机会就大了很多。一样的道理,授权码如果被窃取的话,那么对方就可以直接用你的授权码来获取到token从而窃取到你的信息,在使用的时候我们首先要要求授权码不能够被重复使用,如果一旦发现在token的生命周期内授权码被重复使用的话则会强制销毁此授权码生成的所有token,重新再做一次登陆的授权验证。
写在最后:
授权码是我们平时用到的最多的一种授权方式,它使得我们的的应用程序在获取token之前多了一个额外的安全层来保证我们的授权和访问过程是安全可靠的。
参考资料: https://oauth.net/2/grant-types/authorization-code/