阅读 418

第三方登录原来是这么回事!(OAuth2.0协议详解)

引言

现在很多网站都支持第三方授权登录,小伙伴们应该很常见这种授权登录方式了,那小伙伴们知道这种方式是以什么原理实现的么?

今天小编就为大家讲一讲里边的奥秘!

正文

OAuth简介

我们都知道,所有的第三方授权登录底层基本上采用 http/https 协议。但是由于 http/https 协议是不可靠的,而客户端和服务端都希望要达到100%的可靠性。所以以OAuth为代表的,基于 http/https 协议的授权标准也由此诞生并变成了主流。最开始在2006年出现的是OAuth1.0,由于1.0出现了一些安全漏洞等一些问题,5年后的2011年,该团队发布了OAuth2.0标准。

由于目前各大网站已经基本淘汰了OAuth1.0,用OAuth2.0标准来实现的授权功能,所以这篇文章是针对OAuth2.0来介绍的。

角色介绍

OAuth可以分为四个角色,我们这里就拿掘金来举例:

  • resource owner:可以理解为用户,在这里就是你自己;只有这个用户同意第三方或者基于OAuth的授权方式时,才能进行后续操作。
  • resource server:资源服务器,在这里就是掘金这个平台。
  • client:即客户:如果你是用浏览器浏览的掘金网站的话,那浏览器就是client。
  • authorization server:授权服务器;使用微信,GitHub,还是微博来授权呢,使用哪种方式哪个平台就是authorization server。

运行流程

介绍完四个角色,接着让我们来介绍一下它的运行流程:

  • (A)客户端请求用户的授权;用户要告诉客户端,是否要用第三方授权,是微信?QQ?还是微博?
  • (B)当用户的同意授权后,把同意授权的消息发送到客户端
  • (C)当B结束后,客户端拿着这些同意授权的信息去请求授权服务器,这里的授权服务器就是你所选的微信授权的服务器还是QQ授权的服务器。
  • (D)如果授权服务器得到并验证这些授权信息有效的话,这时授权服务器会颁发客户端一个访问令牌(在微信公众号的网页授权中,访问令牌的字段名称是access_token
  • (E)客户端收到令牌,将其发送给资源服务器申请资源,这里的资源服务器就是我们的掘金服务器。
  • (F)资源服务器确认无误后,说明认证通过,资源服务器可以将资源返回给客户端

客户端授权模式

在上面B步骤中,OAuth2.0一共有四种授权模式,我们来一一做个介绍:

  • 授权码模式(Authorization Code)
  • 简化模式(Implicit)
  • 密码模式(Resource Owner Password Credentials)
  • 客户端模式(Client Credentials)

授权码模式(Authorization Code)

  • (A)用户带着客户端标识符重定向的URI本地状态请求范围这四个属性去请求授权服务器。这里的本地状态是可选属性,可以选择不传。但是如果不传可能会遭受到CSRF攻击,大家可以视情况而定;
  • (B)授权服务器用户进行身份验证,用来确定用户是授予还是拒绝;
  • (C)假设用户被授予了访问权限,授权服务器会将用户重定向到之前所提供的重定向URI中。重定向URI中还包括本地状态客户标识符
  • (D)接着客户端将带着本地状态客户标识符去请求授权服务器,目的是换取对应的访问令牌
  • (E)授权服务器接到客户端的请求后,检验本地状态客户标识符,如果验证通过,将为客户端返回对应的访问令牌和(可选)刷新令牌

这里是一篇典型以授权码模式来授权的文档,可以结合这读一下。

developers.weixin.qq.com/doc/offiacc…

简化模式(Implicit Grant)

  • (A)客户端代理用户去请求授权服务器

  • (B)用户决定是否给客户端授权;

  • (C)当用户同意授权后,客户端将重定向到重定向URI重定向URI中并存在着访问令牌

  • (D)接着浏览器请求资源服务器,并且不用带着访问令牌

  • (E)资源服务器通过认证后,返回一个网页,并包含访问令牌

  • (F)浏览器解析这个网页并提取访问令牌

  • (G)浏览器发送令牌给到客户端

密码模式(Resource Owner Password Credentials)

  • (A)用户客户端提供用户名和密码;

  • (B)客户端用户提供的资源请求授权服务器

  • (C)授权服务器进行身份验证,通过后发出访问令牌

客户端模式(Client Credentials)

  • (A)客户端授权服务器进行身份验证,所要访问令牌

  • (B)授权服务器客户端进行身份验证,如果有效,则发出访问令牌

参考资料

1,OAuth2.0文档:www.rfcreader.com/#rfc6749

2,阮一峰的《理解OAuth 2.0》的博客:www.ruanyifeng.com/blog/2014/0…