OAuth2.0认证学习及strava实践

269 阅读4分钟

前言

最近在尝试调用strava api接口,希望获取存储在上面的数据。然而登录服务器第一步就是要通过OAuth2.0的认证,因此本篇主要记录了我对于OAuth的学习和认识,以及使用java的实践。

OAuth认证介绍

OAuth是一种开放的标准协议,他允许第三方应用向资源拥有者发起请求并获取资源的访问权限,而不需要向第三方应用暴露用户的密码,被广泛用在第三方登录场景中。OAuth1.0于2007年首次被提出,由于存在着伊西俄安全性问题,目前绝大部分互联网公司采用改进后的OAuth2.0作为认证协议。本文将先简单介绍一下OAuth1.0的流程并说明其缺陷,进而详细介绍OAuth2.0以及他的实践。

OAuth1.0

OAuth1.0的认证流程如下图所示:

image.png

流程中主要涉及到三个角色

consumer:需要通过OAuth协议请求服务提供方获得数据的第三方应用。

service provider:服务提供方,允许第三方应用通过OAuth协议获取相关数据。

User:用户,在服务提供方service provider存储数据的人。

流程:

  1. consumer向服务提供方发起申请,获得Request token。
  2. 服务提供方返回consumer未授权的Request token以及secrete。
  3. consumer携带者request token和secrete请求服务器,调起授权页面。
  4. 用户授权
  5. 服务提供方将用户重定向到consumer中,并返回了授权后的request token。
  6. consumer使用授权后的request token交换到了access token。
  7. consumer采用access token获取服务提供方存储的用户数据。
sequenceDiagram
consumer->> service provider: 请求未授权的request token
service provider -->> consumer: 返回未授权的request token和token secrete

consumer ->> service provider: 携带上未授权的request token和callback请求服务器
service provider ->> service provider: 用户授权登录

service provider -->> consumer: 服务器重定向用户到consumer,并返回授权后的request token
consumer -> service provider: 携带授权后的request token,请求换取access token
service provider --> consumer: 返回access token及access token secrete

OAuth1.0优点在于会对每个token进行加密 缺点:

  1. 采用http协议
  2. 易受到劫持: 攻击者会首先接入consumer,并向service provider请求,获得一个没有授权的request token。此时,原本应该将攻击者重定向到service provider进行授权登录,但是这一步被攻击者截断,攻击者同时也通过一定的方式获得重定向的url。攻击者通过某种方式让用户点击这个url,用户登录授权页面登录后,攻击者伪造回调地址,并换取用户的access token,从而访问到用户的个人数据。

根本问题在于,请求未授权request token、授权登录、获取access token过程中,service provider无法判断这些请求是否是同一个用户发起,进而产生了漏洞。

OAuth2.0

Oauth2.0于2012年发布,解决了1.0中参数众多、实现复杂以及易被劫持的问题。目前是被大部分开放平台组为的认证协议。

Oauth2.0包含以下几个角色定义:

resource owner:提供用户资源服务的平台。

resource server:资源服务器

client:客户端

authorization server:授权服务器,负责访问令牌、验证令牌以及刷新令牌的颁发

Oauth2.0协议中有多种授权模式:授权码模式、简化模式、密码模式、客户端模式。在授权码模式中,用户会在授权服务器上授权,返回给客户端授权码code,客户端通过code交换得到access token以及refresh token,access token有着一定的过期时间,为了防止用户多次授权,可采用refresh token刷新access token。客户端可使用access token访问用户的资源数据。

image.png 第三方登录流程:

  1. 第三方应用引导用户到授权服务器上授权
  2. 用户完成授权后,客户端会得到对应的授权码code
  3. 客户端携带code继续请求授权服务器,请求授权
  4. 服务器验证code通过后,返回客户端对应的access token、refresh token、expire at等信息
  5. 客户端通过access token访问用户数据

Q:授权过程中为什么先要code,在请求到access token呢?为什么不合并成一次请求? A:如果第三方应用采用http协议请求access token,过程中可能会被挟持,直接得到access token会泄露用户全部数据。code一般性只有较短的有效时间,而且连续使用两次会直接让access token失效,这个好处在于,如果授权的过程中code被劫持了,当第三方应用也得到code时,连续请求会让劫持得到的access token失效,保证了安全性。

OAuth2.0的实践

  • 输入一个授权请求,请求中带上客户端id、响应形式、重定向地址以及授权的范围。用户会被引导至授权登录页面,点击授权后会进行重定向。 image.png

  • 点击授权,用户会被重定向到redirect url上,url后会带上一个授权码code

image.png

  • 最后将授权码code携带上,再次请求授权服务器,就可以得到获取用户数据的专属access token和刷新access token的refresh token,以及token的过期时间啦!

image.png