OAuth 2.0 开放授权原理

Posted Web开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OAuth 2.0 开放授权原理相关的知识,希望对你有一定的参考价值。

来自: Nicol的博客铭

链接:https://taozj.org/2016/05/OAuth-2-0-开放授权原理/(点击尾部阅读原文前往)


OAuth 2.0是一个开放授权协议,是1.0的更新替代版,据说是比1.0简化方便了许多。这个协议是用于授权访问开放资源的,但我觉得对自己最大的方便的是很多网站支持的话,可以方便地用授权账号登陆,而免除注册-激活-登陆这些繁琐的步骤。




1、OAuth 2.0 协议介绍


1.1 OAuth 2.0 授权过程概述


下面,以客户端Web应用程序请求资源的例子(最常见的Authorization Code认证类型),描述一下OAuth 2.0 授权请求的过程,想必使用过的人(作为Resource Owner)一定很熟悉吧。


自此,当客户端程序得到了access token,就可以用这个令牌访问申请的资源信息了。


1.2 OAuth 2.0 角色类型、客户类型和客户属性


OAuth 2.0 共有四种角色,分别是:Resource Owner、Client Application、Resource Server、Authorization Server。Resource Owner一般指的拥有资源的用户或者程序,Client Application是请求资源的程序,认证服务器和Resource Server可以是同一台服务器或者不同的服务器构成的。

协议中,OAuth 2.0有两种客户类型:Confidential和Public,前者是能够保存认证服务器给予的client password,用以让服务器识别客户,常用于Web App;后者用于不能保存client password的情况,比如手机App或者桌面App,以及javascript应用程序。

客户属性(Profiles)包括Web Application、User Agent和Native:Web Application通常包括Browser端和Server端,用户密码常常被保存在Server端,因此可以是Confidential的类型;User Agent常常是运行在浏览器中的Javascript小程序或者小游戏;Native通常是运行在移动端或者桌面的应用程序。


1.3 OAuth 2.0 认证


整个认证过程包括:


1.3.1 客户端应用向认证服务器注册


首先,开发的应用程序需要向Facebook/Google/Twitter这类Resource Server的认证服务器进行注册,然后认证服务器会为客户端应用提供唯一的client id和client password,同时客户端程序还需要向认证服务器提供redirect URI,一旦客户端通过了认证服务器的认证,返回客户端之后Resource Owner将被带到这个redirect URI。


1.3.2 认证授权(Grant)


主要是客户端程序通过认证服务器的认证之后,Resource Server授权批准给客户端程序的权限。其认证和授权包括四种类型,每一种都包括不同的安全属性:Authorization Code、Implicit、Resource Owner Password Credentials、Client Credentials。


1.3.2.1 Authorization Code


如上面概述的过程,是最常见也是最严格的认证模式:


(1)用户访问应用程序;
(2)应用程序提示用户通过Facebook/Google/Twitter方式登陆;
(3)用户被重定向到了认证服务器,同时应用程序附加自己的client id给认证服务器;
(4)用户在认证服务器上登陆,登陆成功之后提示用户是否Grant应用程序访问资源,用户允许后被重定向到应用程序;
(5)当回到应用程序后,认证服务器将用户导向到redirect URI,同时附加authorization code;
(6)当redirect URI被访问后,应用程序和认证服务器就直接相连了,应用程序向认证服务器发送authorization code、client id、client password;
(7)认证服务器接受这些信息后,返回access token;
(8)应用程序之后通过access token访问资源信息;


OAuth 2.0 开放授权原理


1.3.2.2 Implicit


相比 Authorization Code认证方式简化了过程,当用户登录认证服务器完成认证,然后定向到redirect URI,此时认证服务器直接返回access token,而不是上面的authorization code。

这种情况一般是User Agent和Native的类型,Web Server不会保存client password/access token,当然User Agent或者Native App保存client password/access token在本地也是不安全的。


OAuth 2.0 开放授权原理


1.3.2.3 Resource Owner Password Credentials


通过交付用户账户和密码给应用程序,授权应用程序访问用户资源。这种情况必须极度信任该应用程序才行,想想你交付的可是账户和密码哦!


1.3.2.4 Client Credentials


授权应用程序访问公共资源,而不特定针对某个特别的用户情况的。


1.4 OAuth 2.0 请求和响应格式


针对上面的四种认证授权类型,分别有不同的请求和响应数据格式


1.4.1 Authorization Code


包括两个请求和两个响应


  • 认证请求
    response_type: code
    client_id: 认证服务器提供的client_id
    redirect_uri: 应用程序注册的redirect URI
    scope: 申请的权限、范围

  • 认证响应

        code: 认证服务器返回的authorization_code

  • 认证错误
    error: 预先约定的错误码
    error_description:
    error_uri: 指向错误详细描述的页面

  • Token请求
    client_id:
    client_secret:
    grant_type: authorization_code
    code:返回认证服务器给的authorization_code
    redirect_uri:

  • Token响应
    access_token:
    token_type:
    expires_in: access_token失效的时间,用秒计量
    refresh_token:


1.4.2 Implicit


包括一个请求和一个响应


  • 请求
    response_type: code
    client_id: xxx
    redirect_uri:
    scope:

  • 响应
    access_token:
    token_type:
    expires_in:
    scope:

  • 错误
    同上。


1.4.3 Resource Owner Password Credentials


包括一个请求和一个响应


  • 请求
    response_type: password
    username:
    password:
    scope:

  • 响应
    access_token:
    token_type:
    expires_in:
    refresh_token:


1.4.4 Client Credentials


包括一个请求和一个响应


  • 请求
    grant_type: client_credentials
    scope:

  • 响应
    access_token:
    token_type:
    expires_in:


2、OAuth 2.0 协议举例


本着实践的精神,试了一下国内第一大浪的开放平台的OAuth授权。


2.1 注册账户,创建应用


在新浪微博开放平台注册开发者账户,然后创建一个应用,得到应用的信息如下:


应用名称:测试应用的哈
App Key(Client ID):476302957
App Secret(Client Password):1dd5950b4c7165a4203ae9a5b986c105
创建时间:2016-05-23
回调页面:http://abc.com/


2.1 采用新浪提供的授权接口,进行Authorization Code授权请求


新浪Authorization Code授权请求的URL格式如下(GET方式):
https://api.weibo.com/oauth2/authorize?client_id=476302957&response_type=code&redirect_uri=http://abc.com/


OAuth 2.0 开放授权原理


2.2 获取授权码,换取access_token


上面一部授权允许后,会转到redirect URI,并附加授权码


OAuth 2.0 开放授权原理


https://api.weibo.com/oauth2/access_token?client_id=476302957&client_secret=1dd5950b4c7165a4203ae9a5b986c105&grant_type=authorization_code&redirect_uri=http://abc.com/&code=c7502d6f5d015f7ae99b44a9c9d57cd3



2.3 使用access_token


得到了access_token,就可以当作令牌访问用户的授权数据了,比如下面将会得到用户好友的列表:

https://api.weibo.com/2/friendships/friends.json?screen_name=nicol_tao&access_token=2.00rfgxpB0lJWOW042307510b4MBhGC


参考

  • OAuth 2.0 Tutorial

  • 理解OAuth 2.0

  • oauth2lib

  • 授权机制说明



●本文编号138,以后想阅读这篇文章直接输入138即可。

●输入m可以获取到文章目录


更多推荐

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、ios开发、C/C++、.NET、Linux、数据库、运维等。传播计算机学习经验、推荐计算机优秀资源:点击前往《》!

以上是关于OAuth 2.0 开放授权原理的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2.0

OAUTH 2.0深入了解:以微信开放平台统一登录为例

OAUTH 2.0的应用

OAuth 2.0

OAuth 2.0 极简教程 (The OAuth 2.0 Authorization Framework)

基于oauth 2.0 开发第三方开放平台