OAuth 2.0-授权码模式

237 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

4.1、授权码模式

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。 指的是第三方应用先申请一个授权码,然后再用该码获取令牌。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

授权码模式的实现步骤:

图片.png (A)用户访问客户端,后者将前者导向认证服务器。

(B)用户选择是否给予客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

光看文字介绍,不理解的,下面用实例来说明一下

通过qq登录天涯论坛

图片.png

准备工作

  • 天涯论坛的开发者在QQ处申请一个开发者账户,获得一个开发者标识,提供一个回调接口:
{
    'client_id': 100253980,
    'client_secret': 123456,
    'callback': 'https://passport.tianya.cn/login/qq.do'
}

用户登录过程:

  • 1、用户访问天涯论坛

图片.png

  • 2、在论坛的登录页面,选择qq登录,

图片.png

此时会跳转到qq域下,这样就可以登录qq账号而不被天涯论坛知道

图片.png

点击qq登录,跳转页面的链接是:

https://graph.qq.com/oauth2.0/show?
which=Login&
display=pc&
client_id=100253980&
response_type=code&
redirect_uri=https%3A%2F%2Fpassport.tianya.cn%2Flogin%2Fqq.do%3Fclient%3Dpc%26fowardURL%3D%2F%2Fbbs.tianya.cn

其中携带的参数中,client_id=100253980是天涯论坛的客户端id,response_type=code是指明授权模式是授权码模式,redirect_uri=https%3A%2F%2Fpassport.tianya.cn%2Flogin%2Fqq.do%3Fclient%3Dpc%26fowardURL%3D%2F%2Fbbs.tianya.cn这是登录后的回调地址

  • 3、qq登录账号

图片.png

4、登录qq成功后,请求用户授权

图片.png

  • 5、用户在手机端确认授权
  • 6、授权通过后,QQ会重定向到天涯论坛页面,并携带授权码code,这是
https://passport.tianya.cn/login/qq.do?client=pc&fowardURL=//bbs.tianya.cn&code=C45AFB28E9D1061DC1FE2977618C494C
  • 7、天涯论坛使用code申请一个长期有效的refresh_token,经过qq验证refresh_token,可以通过refresh_token获得一个access_token,这样就可以获取到你的qq号等信息,具体获得什么信息是在之前的scope指定的

图片.png

grant_type指定了授权类型,之前是用authorization code来获取得到token,所以grant_type就是authorization

  • 8、qq返回给天涯论坛的信息:

图片.png

access_token可以随时用来访问你的信息,所以设置了过时时间,这样及时泄露了,收到攻击的时间窗口也不会很长。当access_token过期后可以使用refresh_token刷新,获得新的有效的access_token,而不需要用户再次登录,refresh_token可以没有过期时间,或者过期时间比access_token长,但是使用次数少,所以相对安全、

使用refresh_token获取新的access_token的链接是:

图片.png

  • 9、天涯论坛使用access_token来访问你的qq信息,access_token一般是放在Authorization这个header中,比如:

图片.png

  • 10、QQ内部校验token是否正确
  • 11、校验通过,qq就会返回响应的信息

天涯论坛根据从qq服务器得到的消息,从而知道你真的是qq为123456的用户,然后为你创建账户。以后你需要登录也可以重复上面的流程,就可以证明你的身份了。