`

oauth2开放认证协议原理及案例分析

 
阅读更多
目前OAuth2到了
v20草稿阶段
,最新的版本是 2011年7月25号发布的,协议变化还是很快的,所以看到国内的一些已经实现的实例,再比照官方的 oauth2,会有些出入的。
为何要 OAuth2来替换OAuth1.1?

    一、OAuth2大大简化了认证流程,OAuth1版本,我都感觉有些流程设计不是为安全性而存在,有些东西很难想一个理由,他们为何要弄得如此复杂。复杂可能是增加安全性的一个要素,但是也极大增加了开发者的开发难度。
    二、增加了对多种不同方式的认证,原来的认证只能直接或间接通过浏览器,现在有专门的标准来给客户端程序、移动应用、浏览器应用提供认证的方法。

OAuth2的四种角色

    resource owner资源所有者:比如twitter用户,他在twitter的数据就是资源,他自己就是这些资源的所有者。
    resource server资源服务器:保存资源的服务器,别人要访问受限制的资源就要出示 Access Token(访问另牌)。
    client客户端:一个经过授权后,可以代表资源所有者访问资源服务器上受限制资源的一方。比如 开发者开发的应用。
    authorization server授权服务器:对 资源所有者进行认证,认证通过后,向 客户端发放 Access Token(访问另牌)。

OAuth2取得Access Token的四种方式

    一、Authorization Code授权码方式:这种是推荐使用的,也是最安全的,也是替换OAuth1.1的一种授权方式。
    流程:
    1、引导用户访问授权服务器,比如地址:

    ?
    1
    2
    3
   
    GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

    ,其中response_type 值固定为 code,client_id就是客户端申请开发者的时候取得的 appkey,state是一个可选参数,可以用于保存客户端在引导用户转向前的一些状态,当回到 redirect_uri的时候会原封不动的传回来,redirect_uri是当用户确认授权应用访问的时候跳转回来的地址。
    2,用户同意授权后跳转回来的的地址如:
    ?
    1
    2
    3
   
    HTTP/1.1 302 Found
    Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
              &state=xyz

    &state=xyz ,其中 code就是 Authorization Code,state就是上面所说的可选参数。
    3,使用取得的 Authorization Code去换取Access Token:
    ?
    1
    2
    3
    4
    5
    6
    7
   
    POST /token HTTP/1.1
    Host: server.example.com
    Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
    Content-Type: application/x-www-form-urlencoded;charset=UTF-8
    
    =authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

    其中 Authorization是由Client id(app key)及Client password(app secret)组合成的 http basic 验证字符串,grant_type必须为 authorization_code,code是上一步取得的 Authorization Code,redirect_uri是完成后跳转回来的网址。
    如果Client不能发送 Authorization信息,则可以使用下面的方式,/token这个地址必须是 https连接的,不然就有泄露 client secret的可能性:
    ?
    1
    2
    3
    4
    5
    6
   
    POST /token HTTP/1.1
    Host: server.example.com
    Content-Type: application/x-www-form-urlencoded;charset=UTF-8
    
    grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
    &client_id=s6BhdRkqt3&client_secret=7Fjfp0ZBr1KtDRbnfVdmIw

    成功的话返回的信息为:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
   
    HTTP/1.1 200 OK
    Content-Type: application/json;charset=UTF-8
    Cache-Control: no-store
    Pragma: no-cache
    
    {
      "access_token":"2YotnFZFEjr1zCsicMWpAA",
      "token_type":"example",
      "expires_in":3600,
      "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
      "example_parameter":"example_value"
    }
    二、Implicit Grant隐式授权:相比授权码授权,隐式授权少了第一步的取Authorization Code的过程,而且不会返回 refresh_token。主要用于无服务器端的应用,比如 浏览器插件。隐式授权不包含Client授权,它的授权依赖于 资源所有者及注册应用时候所填写的redirection URI(跳转地址)。因为Access token是附着在 redirect_uri 上面被返回的,所以这个 Access token就可能会暴露给 资源所有者或者设置内的其它方(对资源所有者来说,可以看到redirect_uri,对其它方来说,可以通过监测浏览器的地址变化来得到 Access token)。
    流程
    一、引导用户访问一个专门的授权页面,如

    ?
    1
    2
    3
   
    GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

    这里的 response_type为 token,client_id为appkey。可以看到这里取Access token的过程中并没有像 第一种方式那样传入 client_secret。因为如果你传入 client_secret,其实就是相当于告诉用户,你应用的app secret了。
    二、在成功授权后,跳转回到 redirect_uri所定义的网址
    ?
    1
    2
    3
   
    HTTP/1.1 302 Found
    Location: http://example.com/rd#access_token=2YotnFZFEjr1zCsicMWpAA
              &state=xyz&token_type=example&expires_in=3600

    ,这样应用就可以通过取地址中的 fragment部分来取得 access token。
    三、Resource Owner Password Credentials资源所有者密码证书授权:这种验证主要用于资源所有者对Client有极高的信任度的情况,比如操作系统或高权限程序。只有在不能使用其它授权方式的情况下才使用这种方式。
    流程:
    一、提交信息到取 token页面

    ?
    1
    2
    3
    4
    5
    6
   
    POST /token HTTP/1.1
    Host: server.example.com
    Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
    Content-Type: application/x-www-form-urlencoded;charset=UTF-8
    
    grant_type=password&username=johndoe&password=A3ddj3w

    这里的 Authorization是 client_id为username,client_secret为password的http basic验证码。grant_type必须为 password,username为用户名,password为用户密码。
    取得的结果如下:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
   
    HTTP/1.1 200 OK
    Content-Type: application/json;charset=UTF-8
    Cache-Control: no-store
    Pragma: no-cache
    
    {
      "access_token":"2YotnFZFEjr1zCsicMWpAA",
      "token_type":"example",
      "expires_in":3600,
      "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
      "example_parameter":"example_value"
    }

    Q:为何要这种这么不安全的方式?
    A:取代原来原始的 username,password的授权方式,而且不需要 client保存用户的密码,client只要保存access token就可以。主要用于客户端程序。
    四、Client Credentials客户端证书授权:这种情况下 Client使用自己的 client证书(如 client_id及client_secret组成的 http basic验证码)来获取 access token,只能用于信任的client。
    流程:
    一、提交参数取 access token

    ?
    1
    2
    3
    4
    5
    6
   
    POST /token HTTP/1.1
    Host: server.example.com
    Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
    Content-Type: application/x-www-form-urlencoded;charset=UTF-8
    
    grant_type=client_credentials

    其中 Authorization是client_id及client_secret组成的 http basic验证串。grant_type必须为client_credentials,
    返回如下:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
   
    HTTP/1.1 200 OK
    Content-Type: application/json;charset=UTF-8
    Cache-Control: no-store
    Pragma: no-cache
    
    {
      "access_token":"2YotnFZFEjr1zCsicMWpAA",
      "token_type":"example",
      "expires_in":3600,
      "example_parameter":"example_value"
    }

国内一些oauth2案例分析

标准的 oauth2中,使用 access token来向资源服务器发出请求,取得资源。这里的资源服务器需要使用 https协议,否则access token极可能被其它方获取。比如
?
1
2
3

GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer 7Fjfp0ZBr1KtDRbnfVdmIw


bearer是指 token类型
,后面的字符串就是access token。还有一种
mac类型的 token(目前v20版本的草稿里还没有文档)
,如:
?
1
2
3
4
5

GET /resource/1 HTTP/1.1
Host: example.com
Authorization: MAC id="h480djs93hd8",
                   nonce="274312:dj83hs9s",
                   mac="kDZvddkndxvhGRXZhvuDjEWhGeE="

,因为 https速度相较http慢,而且并非所有服务器或客户都支持https,所以国内一些网站采用一种http也可访问资源的方式。


淘宝开放平台的方式
:应用通过用户授权获取的AccessToken的值即等同于Sessionkey,应用凭借AccessToken调用taobao API即可。查看淘宝SDK,可以看到 其使用应用的app_secret作用密码钥来进行签名,参数里面包含了 这个Sessionkey,这样淘宝在收到这个请求的时候,根据 app_id来判断是哪个应用,根本sessionkey的值来判断是哪个用户,如果不传这个 sessionkey就用 app_id查得app_id所属的淘宝用户就行了。也就是说 sessionkey必须配合 这个 client自己的授权资料appkey appsrecet来访问资源。


百度开放平台方式

人人网方式
、还有腾讯也类似:在返回 access token的同时返回 sessionKey及sessionSecret。如:
?
1
2
3
4
5
6
7
8

{
    "access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
    "expires_in": 86400,
    "refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328",
    "scope": "basic email",
    "session_key": "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A=",
    "session_secret": "27e1be4fdcaa83d7f61c489994ff6ed6",
}

在调用资源API的时候,如下:
?
1
2

GET /rest/2.0/passport/users/getInfo?session_key=9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A%3D&timestamp=2011-06-21+17%3A18%3A09&format=json&uid=67411167&sign=d24dd357a95a2579c410b3a92495f009 HTTP/1.1
Host: api.example.com

这里参数里面的 session_key,传给服务器后,用户查询 session_secret,sign使用session_secret作为密钥来加密的。可以看到这里调用的时候没有使用 client_id或client_secret信息,所以对于任何获取
?
1
2

"session_key": "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A=",
"session_secret": "27e1be4fdcaa83d7f61c489994ff6ed6",

的一方都可以调用到API。降低系统耦合度。

原文链接:http://kejibo.com/oauth2/
分享到:
评论

相关推荐

    OAuth2.in.Action.2017.3.pdf

    #### 五、OAuth2实战案例分析 **章节6:OAuth2.0在现实世界中的应用** - **应用场景**:包括但不限于社交媒体登录、云存储服务、API网关等。 - **案例研究**:通过对真实案例的分析,展示OAuth2.0的实际效果及其对...

    Oauth2安全

    OAuth2.0作为一种开放的标准协议,旨在解决应用间的授权问题,允许一个应用代表另一个应用或者终端用户去请求服务。阮一峰在其文章《理解OAuth2.0》中对OAuth2.0进行了详细介绍,本文将进一步解析该协议的核心概念和...

    kisso中间件 v3.8.3.zip

    【kisso中间件 v3.8.3.zip】是一个包含源码的压缩包,主要用于构建和增强Web应用系统的身份认证与授权功能。...通过深入研究和理解其源代码,开发者可以更好地掌握OAuth协议和中间件设计原理,提升自己的技能。

    SavvyNet:SavvyNet 一款允许您使用 Linkedin OAuth 登录的应用程序

    总的来说,SavvyNet是一个很好的学习案例,可以帮助开发者深入理解OAuth 2.0认证以及Java中与RESTful API交互的实践。通过研究这个项目,你可以提升自己的Java编程技能,同时掌握第三方登录服务的实现原理。

    安卓开发, 淘宝开放平台 SDK

    3. **授权认证**:通过OAuth 2.0协议获取用户的授权,这样可以在用户同意的情况下访问他们的淘宝账户信息。 4. **调用API**:使用SDK提供的类和方法,根据业务需求调用相应的淘宝开放平台API。 5. **处理响应**:...

    安卓社会化分享第三方登录相关-第三方登录和获取登录后信息的案例源码.rar

    - 第三方登录通常依赖OAuth或OpenID等开放授权协议。用户通过第三方平台(如微信、QQ、微博等)授权应用访问其基本信息,应用通过获取到的令牌(Token)与第三方服务器交互,获取用户的登录状态和信息。 2. **...

    PHP开发QQ第三方登录功能 实战视频课程

    #### 五、实战案例分析 1. **项目搭建**: - 准备环境:安装PHP运行环境、配置Web服务器等。 - 创建项目目录结构,初始化必要的文件。 2. **代码实现**: - 编写登录界面,集成“使用QQ登录”按钮。 - 实现...

    Android 北京工商大学上网登陆Android版源码-IT计算机-毕业设计.zip

    开发者需要理解并实现HTTP或HTTPS协议,以及可能涉及到的OAuth或WLAN认证流程,这些是Android网络编程的基础。 源码分析方面,我们可以看到以下几个关键部分: 1. **用户界面(UI)**:应用的界面设计是用户体验的...

    DISCUZ!NT 2.0 用户整合说明文档.CHM

    7. **案例分析与最佳实践**:为了更好地理解和应用用户整合,文档可能还包含了一些实际案例分析,展示如何成功地将DISCUZ!NT 2.0与其他系统整合。 8. **教程与步骤**:每一步整合过程都有详细的步骤指导,包括必要...

    java毕业设计&课设-大型电商分布式系统实践(视频+源码).doc

    - **身份验证**:使用JWT(JSON Web Token)或OAuth2.0等协议实现用户登录认证。 - **输入过滤**:采用正则表达式或其他方式对用户提交的数据进行校验,防止SQL注入、XSS攻击等安全风险。 - **权限控制**:通过...

    sparkweb-源代码

    2. **WebSocket通信**:由于即时通讯要求低延迟、双向实时通信,SparkWeb会使用WebSocket协议与Openfire服务器建立持久连接。WebSocket提供了一个低延迟的全双工通道,允许服务器主动向客户端推送数据。 3. **XMPP...

    新浪微博SDK,带示例

    1. **API接口**:提供与微博服务器通信的接口,如OAuth认证、数据获取、内容发布等。 2. **库文件**:包含实现API功能的代码,开发者可以通过调用这些库中的函数来实现所需功能。 3. **示例代码**:帮助开发者理解和...

    支付宝当面付打赏系统.rar

    8. **API调用认证**:理解OAuth2.0或其他认证机制,以安全地获取和使用API访问权限。 9. **服务器配置**:部署应用到Web服务器,如Apache或Nginx,以及PHP运行环境的配置。 通过以上分析,我们可以看到,支付宝...

Global site tag (gtag.js) - Google Analytics