OAuth1.0 和OAuth2.0的区别

一、为什么出现OAuth?

OAuth是一个开放的标准,在移动、web平台能提供一种安全地API授权,使第三方应用不需要密码账号通过授权的方式就可以进行登录。

要解决的问题:打破传统的账号密码登录登录方式,不管是对于用户还是应用提供商,都能安全保障账号数据不被泄露。

二、OAuth1.0 (-2012.4.20)

OAuth1.0 和OAuth2.0的区别_第1张图片

1 请求request code 和 access token过程中,得到的客户端错误响应码:

  • 1.1 HTTP 400 Bad Request 请求出错

    • 1.1.1 Unsupported parameter 不支持的参数

    • 1.1.2 Unsupported signature method 不支持的签名方法

    • 1.1.3 Missing required parameter 少传必需的参数

    • 1.1.4 Duplicated OAuth Protocol Parameter 重复的OAuth协议参数

  • 1.2 HTTP 401 Unauthorized 未授权

    • 1.2.1 Invalid Consumer Key 无效的Consumer key

    • 1.2.2 Invalid / expired Token 无效的token

    • 1.2.3 Invalid signature 无效的签名

    • 1.2.4 Invalid / used nonce 无效的随机数

    •  

 

解释

优点和缺点

 

OAuth2.0

主要有4种授权模式,最全面的是授权码模式。见下图

改进1:去掉签名,改用SSL(HTTPS)确保安全性。

改进2:所有的token不再有对应的secret存在,签名过程简洁,这也直接导致OAuth2.0不兼容老版本。

改进3:能更好地支持不是基于浏览器的应用。

改进4:OAuth2.0的访问令牌是“短命的”,且有刷新令牌(OAuth1.0可以存储一年及以上)

 

 

OAuth1.0a

1.向服务器端请求未授权的request token,入参

oauth_consumer_key oauth_signature_method oauth_signature oauth_timestamp oauth_nonce oauth_version oauth_callback

2.服务器返回未授权request token

oauth_token oauth_token_secret oauth_callback_confirmed

3.传参未授权request token请求资源存储服务器的授权页

oauth_token

4.授权成功,返回授权后的request token

oauth_token oauth_verifier
5.使用授权的request token换取access token

oauth_consumer_key oauth_token oauth_signature_method oauth_signature oauth_timestamp oauth_nonce oauth_version oauth_verifier

6.返回access token与access token secret换取资源。

oauth_token oauth_token_secret

总结:OAuth1.0a和OAuth1.0的过程看起来一样,但是改进了每一步骤里面的入参和返回值,仔细一看是不一样的。

具体改进1:将oauth_callback回调时机提前,参与签名过程。下一步将没办法伪造回调地址。

具体改进2:用户授权后,返回oauth_verifier,它会被用Consumer申请Access Token的过程中。攻击者无法猜测它的值。

 

缺点:

1.使用的是http协议

2.签名过程复杂而实用性不高。

 

OAuth1.0

1.客户端向资源服务器请求未授权Request Token,传入以下参数

oauth_consumer_key oauth_signature_method oauth_signature oauth_timestamp oauth_nonce oauth_version

2.服务器返回未授权Request Token和secret,返回参数如下:

oauth_token oauth_token_secret

3.客户端入参oauth_token oauth_callback请求服务器,调起授权页面

oauth_token oauth_callback

4.等用户授权后,回到客户端,返回授权Request Token

oauth_token

5.获取到授权Request Token,再向资源服务器换取票据accessToken,传入参数:

oauth_consumer_key oauth_token oauth_signature_method oauth_signature oauth_timestamp oauth_nonce oauth_version

6.返回oauth_token oauth_token_secret

 

优点:步骤1是签名过程

缺点:

1.用的是http协议,申请RequestToken过程中,容易被攻击者调包。

2.攻击者调包后的目的就是伪造回调地址,拿到用户的accessToken。

那么OAuth1.0a的产生主要是为了修复以上的问题。

 

  •  
  • 三、OAuth2.0

    授权模式

    步骤流程

    备注

    授权码模式

    OAuth2授权流程主要分为4步:

    1. 引导用户进入授权页面同意授权,获取code

    2. 重定向第三方应用,通过code换取授权access_token

    3. 如果需要,开发者可以通过refresh_token刷新授权access_token,避免过期

    4. 通过授权access_token获取用户基本信息

    场景:微信OAuth2.0,支持授权码模式。

    code有效期十分钟,且只能使用一次,服务器会根据code和有效期时间作对比,如果不是则授权失败。

    access_token的有效期两个小时,过期后refresh_token刷新。

    这种模式跟老版本最为贴近,相比其他模式复杂些,但更安全。适用于所有有Server端的应用,如Web站点、有Server端的手机客户端。 

     

    简化模式

    OAuth2授权流程主要分为3步:

    1. 引导用户进入授权页面同意授权,获取授权access_token

    2. 如果需要,开发者可以通过refresh_token刷新授权access_token,避免过期

    3. 通过授权access_token获取用户基本信息

    场景:QQ第三方登录

    简化者模式一步到位获取到access_token,如何保证安全?

    适用于所有无Server端配合的应用,

    密码模式

    OAuth2授权流程主要分为3步:

    1.用户向客户端提供用户名和密码

    2.客户端将用户名和密码发给认证服务器,向认证服务器请求令牌

    3.认证服务器确认无误后,向客户端提供访问令牌。

    这种模式适用于用户对应用程序高度信任的情况。

    客户端模式

    OAuth2授权流程主要分为两步:

    1.客户端发出HTTP请求,传参

    grant_type scope

    2.认证服务器向客户端发送令牌

    access_token expires_in

    客户端模式应用于应用程序与授权服务器以及资源服务器进行互动。无机密传输。

     

  • 授权码模式
  • OAuth1.0 和OAuth2.0的区别_第2张图片

Q&A

  1. 1. 在授权码模式下,授权服务器先返回授权码code给第三方应用,第三方应用再利用授权码来换取access_token。为什么不直接返回access_token?

    主要是为了安全考虑,在第三方应用http协议的情况下,容易被中间者攻击,很容易被中间者劫持到access_token。code的存在便是解决中间者攻击问题的。假如code被中间者拿到,不是一样也会拿到access_token吗?其实不是,code有效期十分钟且只能被使用一次,当攻击者拿到code请求授权服务器,第三方应用也拿code请求授权服务器,攻击者和第三方应用同时拿到access_token,授权服务器会因为code被使用两次,将本次access_token失效。

  2. 2.Implicit 就是直接获取的 access token,那它怎么处理中间人攻击?

    QQ互联开放平台QQ登陆oauth授权接口可以劫持access_token

    第三方应用和认证服务器等全程强制用https协议的情况下,redirect_url后面加上#

         3.为什么授权模式为了避免CSRF攻击,可以在URL请求后面加个参数state,这是什么原理?

             state参数能标记这是来自哪一个网站,state参数是攻击者拿不到的,因此可以避免CSRF攻击。

 

备注:

  1. CSRF(Cross-site request forgery):跨站请求伪造,利用的是网站对网页浏览器的信任,攻击者主要做的就是欺骗用户浏览器,以用户的名义进行操作。

    主要的防范措施:1.在http头部增加一个referer字段,这个字段就可以标记这是来自哪一个网站 。 2.服务器下发一个随机 Token,每次发起请求时将 Token 携带上,服务器验证 Token 是否有效。

你可能感兴趣的:(ios)