OAuth2.0是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。

  • OAuth2.0(开放授权)是一个正式的互联网标准协议。
  • 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息。而这种授权无需将用户提供用户名和密码提供绐该第三方网站。
  • OAuth2.0允许用户提供一个令牌绐第三方网站,一个令牌对应一个特定的第三方网站,同时该令牌只能在特定的时间内访问特定的资源。

  1. 授权码模式(authorization code)
  2. 简化模式 (implicit)
  3. 密码模式(resource owner password credentials)
  4. 客户端模式(client credentials)
  • 授杈码模式是功能最完整、流程最严密的授权模式
  • 简化模式不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了''授权码"这个步骤
  • 密码模式需要用户向客户端提供自己的用户名和密码
  • 客户端模式指客户端以自己的名义,而不是以用户的名义,向''服务提供商"进行认证

授权码模式详解

实现OAuth2.0协议中的必选方法

  • 实现重定向的机制
  • 实现授权码的机制
  • 实现token发放的机制

简介:OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用(典型:第三方登录),目前的版本是2.0版。
没有OAuth的时代:
假设我们有这么一个场景:有三个角色,分别是“用户”,“第三方应用”,“服务提供商,比如google”
用户有很多照片都存放在google服务器,这时候,用户需要借助第三方应用“云冲印”,将存放在google服务器的照片打印出来,那么此时我们正处于没有OAuth的时代,这时候,用户登录第三方应用“云冲印”之后,就得需要将用户在google的帐号和密码提供给“云冲印”,这时候“云冲印”拿着用户提供的google帐号和密码,登录到google服务器,再而获取用户的照片,接着后续的打印工作。
那么上面是一个模拟的场景,在没有OAuth的时代,我们也只能这么做,那么会导致什么样的问题发生,缺陷如下:

严重缺点:

(1)云冲印完全保存用户密码,导致用户的google帐号不安全;

(2)客户端获取用户存储在google服务器的所有资料,用户没法限制第三方应用“云冲印”的授权范围和有效期;

(3)用户只有修改密码,才能收回赋予第三方应用“云冲印”的权利;

(4)最为严重:“云冲印”站点遭遇攻击,用户密码泄露,意味着用户在google的信息泄露;

基于以上几个缺陷,OAuth诞生了。
OAuth作用:就是让"客户端”(第三方应用:上文的云冲印)安全可控地获取"用户"的授权,与"服务提供商"进行互动。
目前OAuth有三个版本:OAuth1.0,OAuth1.0a,OAuth2.0
OAuth1.0

用一副图来解释OAuth1.0的整个运行流程如图1所示:

图1:OAuth1.0流程图

这是相关“雅虎”站点进行OAuth认证的整个运行流程:
参与者:Application,YAHOO!,User
(1)客户端在自己站点实现YAHOO!的第三方认证之前,需要到YAHOO!服务提供商申请帐号Consumer Key,YAHOO!通过申请之后,并发放Consumer Key已经对应的Consumer Secret的一套认证帐号,这时候说明该客户端已经加入了YAHOO服务提供商的认证服务。
(2)获取Request Token,需要传递参数:
          oauth_consumer_key:应用ID
          oauth_nonce:客户端生成的随机数
          oauth_signature_method:签名方式(目前有:HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种)
          oauth_timestamp:时间戳
          oauth_version:OAuth版本号
          xoauth_lang_pref(optional):
          oauth_callback:
     YAHOO!验证用户参数合法,通过验证,同意发放Request_Token,返回客户端参数:
          oauth_token:请求令牌
          oauth_token_secret:令牌对应的密钥
          oauth_expires_in:令牌过期时间
          xoauth_request_auth_url:
          oauth_callback_confirmed=true
(3)客户端接收到Request_Token,此时将用户导向YAHOO!认证页面,并传递参数:Request_Token
          oauth_token:请求令牌
          此时服务提供商接下来“询问用户是否给予授权”,用户同意授权,服务提供商将用户重定向客户端事先传递的oauth_callback(重定向URI)地址,并以GET方式传递授权码(oauth_verifier)
(4)客户端使用Request_Token以及OAuth_Verifier向服务提供商交换Access_Token:传递参数:
          oauth_consumer_key:应用ID          
          oauth_signature_method:签名方式(目前有:HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种)
          oauth_signature:签名(注意,这一步骤用到了签名,OAuth签名的生成,详看服务提供商OAuth签名生成文档,此处提供金山快盘签名生成
          oauth_timestamp:时间戳
          oauth_version:OAuth版本号
          oauth_token:Request_Token请求令牌
          oauth_nonce:客户端生成的随机数
          oauth_verifier:授权码
      服务提供商确认签名匹配,参数准确无误,授予Access_Token以及Access_Secret,返回客户端参数:
          oauth_token:Access_Token访问令牌
          oauth_token_secret:令牌对应密钥
          oauth_session_handle:用于刷新过期访问令牌
          oauth_expires_in:令牌过期时间

(5)令牌过期,重新刷新令牌
          与(4)区别唯一参数:oauth_session_handle,不需要传递授权码:oauth_verifier,YAHOO!重新返回Access_Token以及密钥Access_Token_Secret
     注意:这里的oauth_timestamp和oauth_nonce是为防止重放攻击而设置的。具体的来讲:请求者不能在一段时间(服务器允许的客户端和服务端的时间差)内发送同样的请求两次或以上,如果在这个时间段之后再次发生这个请求,则会因为超出服务端允许的时间差而被拒绝。
2009 年 4 月 23 日, OAuth 宣告了一个 1.0 协议的安全漏洞。该漏洞影响了 OAuth 1.0 核心规范第 6 节的OAuth 的认证流程(也称作 3 阶段 OAuth ), OAuth Core 协议 1.0a 版本解决了这一问题。
OAuth 1.0可能发布地太快了,因此广受批评。之后很快就出现了与之竞争的WRAP(Web资源授权协议),它很快地进行了标准化,成为OAuth的对手。从那时开始,OAuth工作小组就开始着手创建OAuth 2.0。
OAuth2.0:

腾讯,百度,新浪等开放平台都广泛使用了OAuth2.0

关于OAuth2.0的术语:
(1) Third-party application:第三方应用程序,又称”客户端”(client);

(2)HTTP service:HTTP服务提供商,简称”服务提供商”,;

(3)Resource Owner:资源所有者,又称”用户"(user);

(4)User Agent:用户代理,指浏览器;

(5)Authorization server:认证服务器,服务提供商专门用来处理认证的服务器;

(6)Resource server:资源服务器,服务提供商存放用户资源的服务器。它与认证服务器可以是同一台服务器,也可以是不同的服务器;

运行流程: (如下图2所示)

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

图2:OAuth2.0运行简易流程

B(授权)为最关键的步骤!
客户端的授权模式(4种):

(1)授权码模式(authorization code)

(2)简化模式(implicit)

(3)密码模式(resource owner password credentials)

(4)客户端模式(client credentials)
其中:
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。
当然,并不是所有人对OAuth2.0都投赞成票,有兴趣可以看看:OAuth 2.0对Web有害吗?

关于OAuth1.0和2.0的相关区别小结:

(1)1.0每次请求都需要签名,2.0更简洁,不需要签名了

(2)1.0:Request_Token->Authorization_Code; Authorization_Code->Access_Token 2.0:Authorization_Code->Access_Token

(3)1.0每个token都需要加密,2.0则不需要,这样不就不安全了,但是2.0要求使用https(是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。如果不是登陆到一些帐户和密码时,没什么用,只有需要登陆密码时这样候它的作用就非常大了。)协议,安全性更高一筹

(4)2.0有4种授权模式,1.0只有1种

OAuth2.0的原理介绍的更多相关文章

  1. spring oauth2.0 实现原理

    官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. 转载请注明来源:htt ...

  2. oAuth2.0及jwt介绍

    oAuth2.0流程示意如下: 关于jwt介绍: 说明: 关于jwt简单说明一下,jwt即为json web token,是用来和服务端建立加密通信所使用的的一种“约定”,主要组成见上图即可.服务端一 ...

  3. Oauth2.0认证原理

    Oauth2.0 认证协议 Oauth2.0 应用场景: 微信联合登录     授权管理 互联网开放平台互相调用保证安全 微信提供api  给toov5调用  然后就可以获取一些微信的信息  比如微信 ...

  4. oauth2.0协议原理

    OAuth的授权不会使用第三方触及到用户的帐号信息(如用户密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的. OAuth的作用:就是让“客户端”安全可控 ...

  5. Oauth2.0详解,Oauth2.0协议原理

    角色: RO (resource owner): 资源所有者,对资源具有授权能力的人,通常比喻为用户 RS (resource server): 资源服务器,存储资源.并处理对资源的访问请求 Clie ...

  6. 腾讯微博OAuth2.0认证介绍

    腾讯微博开放平台,是基于腾讯微博系统,为广大开发者和用户提供的开放数据分享与传播平台. 广大开发者和用户登录平台后,就可以使用平台提供的开放API接口,创建应用从微博系统获取信息,或将新的信息传播到整 ...

  7. OAuth2.0认证介绍

    OAuth2.0鉴权 返回 目录 [隐藏] 1 腾讯微博OAuth2.0认证介绍 2 获取accesstoken的两种方式 2.1 1.Authorization code grant 2.1.1 第 ...

  8. 妹子始终没搞懂OAuth2.0,今天整合Spring Cloud Security 一次说明白!

    大家好,我是不才陈某~ 周二发了Spring Security 系列第一篇文章,有妹子留言说看了很多文章,始终没明白OAuth2.0,这次陈某花了两天时间,整理了OAuth2.0相关的知识,结合认证授 ...

  9. 带你全面了解 OAuth2.0

    最开始接触 OAuth2.0 的时候,经常将它和 SSO单点登录搞混.后来因为工作需要,在项目中实现了一套SSO,通过对SSO的逐渐了解,也把它和OAuth2.0区分开了.所以当时自己也整理了一篇文章 ...

随机推荐

  1. 关于snowflake算法生成的ID转换为JS的数字类型由于过大导致JS精度丢失的问题

    JS的数字类型目前支持的最大值为:9007199254740992,一旦数字超过这个值,JS将会丢失精度,导致前后端的值出现不一致. JAVA的Long类型的       最大值为:922337203 ...

  2. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  3. Eclipse和MyEclipse使用技巧--解决MyEclipse中的js报错的小方法

    今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...

  4. .NET 同步与异步 之 线程安全的集合 (十一)

    本随笔续接:.NET 同步与异步 之 警惕闭包(十) 无论之前说的锁.原子操作 还是 警惕闭包,都是为安全保驾护航,本篇随笔继续安全方面的主题:线程安全的集合. 先看一下命名空间:System.Col ...

  5. java maven通过SMTP发送QQ邮件的完全步骤

    1.首先打开QQ邮箱的SMTP服务,因为QQ邮箱对于一般的用户都是默认关闭SMTP服务的. 找到SMTP服务的选项,可以看到此处默认是关闭的,点击开启,然后腾讯会进行一些身份验证,身份验证通过以后,腾 ...

  6. Linksys WRT610n V2 刷ddwrt后安装entware-ng,使用opkg

    安装步骤很简单,首先启用usb.jffs.等. 然后: mkdir -p /jffs/opt mount -o bind /jffs/opt /opt wget -O - http://pkg.ent ...

  7. Bizatlk Accelerator for RosettaNet安装与配置

    以下安装步骤是基于动手实验的BizTalk开发环境(<BizTalk动手实验(一)安装BizTalk Server 2010开发环境> )进行安装. 安装准备 运行账户配置 新建IIS_W ...

  8. [druid]大数据挑战——如何使用Druid实现数据聚合

    -- 知道你为什么惧组件很多的一些开源软件? 因为缺乏阅读能力. 最近我接手了druid+kafka+elk一套等日志系统. 但是我对druid很陌生, 周旋了几天, 官网文档快速开始照着做了下. 看 ...

  9. C#通过用户名与密码访问共享目录

    C#通过用户名与密码访问共享目录 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  10. 【翻译】Nginx的反向代理

    本文为翻译文,原文地址:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/ 本文描述代理服务器的基本配置.你能学到如何 ...