OAuth初探-程序员宅基地

 

       OAuth是一个关于授权(Authorization)的开放网络标准,在全世界得到广泛应用,目前版本是2.0。为了理解OAuth,比如有个云印通的网站,可以将用户存储在谷歌的照片冲印出来。用户为了使用该服务,必须让"云印通"读取自己存储在Google上的照片。

       问题是只有得到用户的授权,Google才会同意“云印通”读取这些照片。那么,云印通怎么获取用户的授权了?

       OAuth就是为了解决上面的问题诞生的

       名词定义

       1.third-party-application   第三方应用程序,本文又称为“客户端” client。

       2.HTTP Service  http服务提供商,即例子中的Google.        

       3.Resource Owner:资源所有者,本文中又称为“用户"(user).

       4.User Agent 用户代理,本文就是指浏览器。

       5.Authorization server :认证服务器,即服务提供商用来处理认证的服务器。

       6.Resource server:资源服务器,即服务提供商用来存放资源的服务器。他也可以与认证服务器是同一台服务器。 

       OAuth的思路

       OAuth在客户端与服务提供商之间,设置了一个授权层(authorization layer)。客户端不能直接登陆“服务提供商”,只能登陆授权层,以此将用户与客户端区分出来。“客户端”登陆授权层所用的令牌(token),与用户的密码不同。用户可以在登陆的时候指定授权层令牌的权限范围与有效期。

        客户端登陆授权层以后,“服务提供商”根据令牌的权限范围以及有效期,向“客户端”开放存储的资料。

          流程如下:

         1.用户打开客户端以后,客户端要求用户给予授权。

         2.用户同意给予客户端授权。(有了用户授权以后,客户端就可以获得令牌)

         3.客户端使用上一步获得的授权,向认真服务器申请令牌。

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

         5.客户端使用令牌,向资源服务器申请获取资源。

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

     客户端的授权模式

       客户端必须获得客户的授权(authorization grant),才能获取到令牌(accessToken).OAuth2.0定义了四种授权方式。

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

      2.简化模式

      3.密码模式

      4.客户端模式

      授权码模式:

       授权码模式是功能最完整、流程最严密的授权模式。他的特点是通过客户端的后台服务器与服务提供商的认证服务器进行互动。

     (A)用户访问客户端,后者将前者导向认证服务器。

     (B)用户选择是否给予客户端授权。

     (C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

     (D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌(token)。这一步是在客户端的后台的服务器上完成的,对用户不可见。

     (E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

         在A步骤中,客户端身份认证的URI,包含以下参数:

         response_type:表示授权类型,必须选,此处的固定值为"code"。

         client_id:表示客户端的id,必选项

         redirect_url :表示重定向的URI,可选项

         scope:表示申请的权限范围,可选项

         state:表示客户端的当前状态,可以指定任意值。 


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

         C步骤中,服务器回应客户端的URI,包含以下参数:

            code:表示授权码,必选项。 有效期很短,客户端只能使用该码一次。

            state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样

HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
          &state=xyz

           D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数

           grant_type:表示使用的授权模式,必选项。此处的值固定为"authorization_code"。

           code:表示上一步获得的授权码,必选项。

           redirect_uri:表示重定向URI,必选项,有上面必须一致。

           client_id:表示客户端ID,必选项。

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

 

              E步骤中,认证服务器发送的HTTP回复,包含以下参数。

              access_token:表示访问令牌,必选项。

              token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。

              expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。

              refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。

              scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。         

     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"
     }

         

         更新令牌:

         如果用户访问的时候,客户端的“访问令牌已经过期”,则需要使用“更新令牌”申请一个新的令牌。

         客户端发出更新令牌的HTTP请求,包含以下参数。

        granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。

        refresh_token:表示早前收到的更新令牌,必选项。

        scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

 POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

 

转载于:https://my.oschina.net/u/3126880/blog/1843845

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33812433/article/details/92376154

智能推荐

智慧工地源码 智慧工地云平台源码 智慧工地APP源码_智慧平台页面源码-程序员宅基地

文章浏览阅读300次。机械、设备、司机识别:所有塔机、升降机具备人脸或指纹等生物识别认证功能,确保人员持证上岗;司机信息实时上传至智慧工地平台。塔机监测: 能够对重要运行参数进行实时监视,包含重量、力矩、高度、幅度、回转角度、运行速度、风速;当塔机出现危险操作时,实时报警数据将推送至智慧工地平台。_智慧平台页面源码

【转】简单的计算机英语列表-程序员宅基地

文章浏览阅读120次。1 简单的计算机英语 CPU(Center Processor Unit)中央处理单元 mainboard主板 RAM(random access memory)随机存储器(内存) ROM(Read Only Memory)只读存储器 Floppy Disk软盘 Hard Disk硬盘 CD-ROM光盘...

AI大事件 | Geoffrey Hinton决定抛弃反向传播,预期策略梯度算法-程序员宅基地

文章浏览阅读74次。呜啦啦啦啦啦大家好呀,又到了本周的AI大事件时间了。过去的一周中AI圈都发生了什么?大佬们互撕了哪些问题?研究者们发布了哪些值得一读的论文?又有哪些开源的代码和数据库可以使用了?文摘菌带你盘点过去一周AI大事件!了解过去一周AI爆点,一篇就够啦!新闻Geoffrey Hinton决定抛弃反向传播来源:WWW.AXIOS.COM链接:https://w..._预期策略梯度算法

[解決方案] conda 虚拟环境中 cuda不同版本進行切換(含Linux 和 Windows)_修改cuda版本-程序员宅基地

文章浏览阅读7.7k次,点赞16次,收藏41次。须安装多个版本的 cudacuda 安装可参考CUDA的下载与安装,去Nvidia官网下载安装所需的 cuda 版本。_修改cuda版本

粒子群算法优化的最小二乘支持向量机分类代码_最小二乘支持向量机代码-程序员宅基地

文章浏览阅读165次。因此,我们可以将这两个算法结合起来,得到一种更为准确的分类算法,即粒子群算法优化的最小二乘支持向量机算法(PSO-LSSVM)。在本文中,我们介绍了如何使用Matlab实现粒子群算法优化的最小二乘支持向量机分类器,并提供了相应的源代码。该算法可以帮助我们更准确地进行数据分类任务,并且可以通过调整参数来适应不同的数据集和问题。因此,它是一种非常实用的分类算法,在实际问题中有广泛的应用。在训练完成后,我们可以使用训练好的PSO-LSSVM模型对测试集进行分类,并计算分类准确率。_最小二乘支持向量机代码

Django连接mysql数据库浅析_django连接mysql可以 数据分析-程序员宅基地

文章浏览阅读503次。一、安装pymysql1. 查看已安装的第三方库的列表   命令: pip list  2. 如果没有pymysql这个第三方库,则安装(需要注意的是django2.2版本的暂时还不支持pymysql,所以如果使用的话,需要先降到2.1版本,不然可能会报错,如果报错,请查看我上一篇的解决办法)   命令:pip install django==2.1.0   命令:pip install pymysql    3. 安装成功后的第三方库二、在主项目的文件中设置连_django连接mysql可以 数据分析

随便推点

TF-A分配堆栈空间详解(TF-A入口分析三)_tf-a 加载地址 入口地址-程序员宅基地

文章浏览阅读618次。在多核处理器环境中,每个CPU核心都需要获得独立的栈空间,从而在并行运行时避免栈空间冲突和竞争。为每个cpu分配堆栈空间仍是由TF-A中入口函数的第一个宏`el3_entrypoint_common`完成的,分配堆栈空间除了设置栈的起始地址和大小,还将栈指针sp(Stack Pointer)寄存器设置为指向该栈的顶部。本文详细地分析了TF-A分配堆栈空间的过程。_tf-a 加载地址 入口地址

Linux配置环境变量_vim /etc/environment-程序员宅基地

文章浏览阅读6.2k次,点赞7次,收藏47次。在配置 Linux 系统服务器的时候,我们常常需要设置系统环境变量,这篇文章就是总结几种常见的配置环境变量的方式。_vim /etc/environment

Boost正则表达式模块的配置信息打印程序-程序员宅基地

文章浏览阅读36次。本文将介绍一个使用Boost正则表达式模块实现配置信息打印的测试程序,帮助读者更好地了解Boost正则表达式库的配置信息。通过这些配置信息,我们可以更好地了解Boost正则表达式库的内部实现,并进行适当的性能优化。同时,使用类似的方式,我们也可以获取其他C++库的配置信息,以便更好地使用和优化这些库。这些配置信息包括库版本、C++03支持、无库模式、额外匹配选项、自定义配置、POSIX支持、递归匹配、其他库依赖和静态链接等。通过以下代码,我们可以获取Boost正则表达式库的配置信息。表示是否依赖于其他库,

Tomcat 可以localhost访问,但不能127.0.0.1访问(转)_windows 安装完tomcat后 127.0.0.1 无法访问-程序员宅基地

文章浏览阅读2.3k次。先介绍一下127.0.0.1与localhost的区别区别1:localhost也叫local ,正确的解释是:本地服务器127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器)他们的解析通过本机的host文件,windows自动将localhost解析为127.0.0.1区别2:localhot(local)是不经网卡传输!这点很重要,它不受网络防火墙_windows 安装完tomcat后 127.0.0.1 无法访问

自定义view,移动view的时候抖动很厉害的解决方案_android 自定义view 拖拽 抖动-程序员宅基地

文章浏览阅读3.1k次。背景解决方案A little bit of progress every dayCome on背景最近学习了自定义view的相关内容,实现了一个方格图的view,然而当方格图超出手机屏幕大小后,需要对其进行移动才能查看超出屏幕的部分。而这移动的实现需要自己重写相关方法才能实现,于是重写了相关方法实现后发现了一个问题:移动的时候,自定义的view抖动的很严重。解决方案解决方案链接 这里给出解决_android 自定义view 拖拽 抖动

Springboot自增主键采用SnowFlake生成-程序员宅基地

文章浏览阅读3.1k次。为什么80%的码农都做不了架构师?>>> ..._springboot 自己写一个主键生成器

推荐文章

热门文章

相关标签