OAuth2.0摘要
一、简介
不使用oauth2.0协议,资源所有者直接给需要使用资源的第三方应用共享凭据时,有这些问题:
- 需要直接共享给第三方应用凭据
- 需要服务器支持密码身份验证
- 凭据的访问权限过大,失去对访问时间和范围的控制
- 不能灵活撤销发出的凭据
- 任何第三方都要共享凭据
oauth引入了授权层,分离了客户端和资源所有者的角色
客户端在请求资源时,被颁发的是另一套凭据
1、角色
oauth的四种角色:
- 资源所有者
- 资源服务器
- 客户端
- 授权服务器
授权服务器和资源服务器可以是同一台,授权服务器可以颁发被多个资源服务器接受的访问令牌
2、协议流程
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+
客户端用于从资源所有者获得授权许可(步骤(A)和(B)所示)的更好方法是使用授权服务器作为中介,而不是直接从资源所有者获取
3、授权许可
(一)授权码
客户端引导资源所有者至授权服务器,许可后授权服务器引导资源所有者带着code授权码回到客户端,客户端再带着code访问授权服务器获取token
(二)隐式许可
简化的授权码模式,资源所有者在授权服务器验证通过以后,直接带着token令牌返回客户端。
减少请求往返的数量,增加了安全风险。在传输的过程中暴露了令牌,没有对客户端做验证
(三)资源所有者密码凭据
当资源所有者和客户端高度信任时,客户端直接带着资源所有者的密码凭据访问授权服务器,换回token
用来一次性获取令牌,客户端可以不用保存资源所有者的密码凭据
(四)客户端凭据
当客户端自己代表资源所有者或者实现和授权服务器约定好时,客户端带着自己的凭据访问授权服务器,换回token
4、访问令牌
令牌代表了访问权限的由资源所有者许可并由资源服务器和授权服务器实施的具体范围和期限
5、刷新令牌
授权服务器可以在颁发访问令牌时多颁发一个刷新令牌
- 用于客户端在访问令牌即将过期时向授权服务器换取新访问令牌
- 用于客户端向授权服务器换取权限相等或更窄范围的访问令牌
+--------+ +---------------+
| |--(A)------- Authorization Grant --------->| |
| | | |
| |<-(B)----------- Access Token -------------| |
| | & Refresh Token | |
| | | |
| | +----------+ | |
| |--(C)---- Access Token ---->| | | |
| | | | | |
| |<-(D)- Protected Resource --| Resource | | Authorization |
| Client | | Server | | Server |
| |--(E)---- Access Token ---->| | | |
| | | | | |
| |<-(F)- Invalid Token Error -| | | |
| | +----------+ | |
| | | |
| |--(G)----------- Refresh Token ----------->| |
| | | |
| |<-(H)----------- Access Token -------------| |
+--------+ & Optional Refresh Token +---------------+
二、客户端注册
客户端需要在授权服务器上注册,不用直接交互,可以依靠其他方式来建立信任关系
当注册客户端时,客户端开发者应该:
- 指定客户端类型
- 提供客户端重定向URI
- 包含授权服务器要求的任何其他信息(如,应用名称、网址、描述、Logo图片、接受法律条款等)
1、客户端类型
根据安全情况分:
- 机密客户端
- 公开客户端
根据客户端配置分:
- Web应用程序
- 基于用户代理的应用
- 本机应用程序
2、客户端标志
一个代表客户端提供的注册信息的唯一字符串
3、客户端身份验证
使用client_id和client_secret作为客户端凭据
使用Basic Authorization基本认证在请求正文中传输,例如:
Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3
三、协议端点
授权过程采用了两种授权服务器端点(HTTP资源):
- 授权端点——客户端用其通过用户代理重定向从资源所有者获取授权。
- 令牌端点——客户端用其将授权许可交换为访问令牌,通常伴有客户端身份验证。
以及一种客户端端点:
- 重定向端点——授权服务器用其通过资源所有者用户代理向客户端返回含有授权凭据的响应。
并不是每种授权许可类型都采用两种端点。
1、授权端点
授权端点被授权码许可类型和隐式许可类型流程使用
客户端使用response_type参数通知授权服务器期望的许可类型,"code"是授权码许可,"token"是隐式许可
完成资源所有者的交互后,授权服务器将用户代理重定向至重定向端点"redirect_uri"
授权服务器必须要求公开客户端和采用隐式许可的机密客户端注册重定向端点,必须是绝对URI,可以注册多个
2、令牌端点
客户端使用授权许可或刷新令牌从令牌端点获取令牌,只有隐式许可用不到
当发起令牌请求时必须使用"POST"方法
在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端与授权服务器进行身份验证,可以使用“client_id”请求参数标识自己
3、访问令牌范围
客户端可以使用“scope”参数来指定访问请求的范围
四、获得授权
OAuth2.0摘要的更多相关文章
- DotNetOpenAuth搭建OAuth2.0
使用DotNetOpenAuth搭建OAuth2.0授权框架 标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物 ...
- 从协议入手,剖析OAuth2.0(译 RFC 6749)
1.介绍 https://tools.ietf.org/html/rfc6749 传统的client-server授权模型,客户端通过使用凭证(通常的用户名和明文密码)访问服务端受保护的资 ...
- springboot+spring security +oauth2.0 demo搭建(password模式)(认证授权端与资源服务端分离的形式)
项目security_simple(认证授权项目) 1.新建springboot项目 这儿选择springboot版本我选择的是2.0.6 点击finish后完成项目的创建 2.引入maven依赖 ...
- 【oauth2.0】【2】JAVA 客户端模式
含义:用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题 步骤: (A)客户端向认证服务器进行身份认证,并要求一个访问令牌(token). (B ...
- OAUTH2.0协议-菜鸟级
OAUTH2.0入门必看 一.摘要 OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即 ...
- SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端
目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证 通过authorization co ...
- 分享一个单点登录、OAuth2.0授权系统源码(SimpleSSO)
SimpleSSO 关于OAuth 2.0介绍: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 系统效果: 登录界面: 首页: 应用界面: ...
- 【OAuth2.0】Spring Security OAuth2.0篇之初识
不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握 ...
- 深入理解OAuth2.0协议
1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...
随机推荐
- Java进程故障排查
故障分析 # 导致系统不可用情况(频率较大): 1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢: 2)代码中有比较消耗CPU的操作,导致CPU过高,系统运 ...
- Spring源码剖析9:Spring事务源码剖析
转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045 声明式事务使用 Spring事务是我们日常工作中经常使用的一项技术,Spring提 ...
- 神经网络 OCR 参考
1. https://blog.csdn.net/u010159842/article/details/87271554 2. https://blog.csdn.net/weixin_4286104 ...
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
- Scala 系列(二)—— 基本数据类型和运算符
一.数据类型 1.1 类型支持 Scala 拥有下表所示的数据类型,其中 Byte.Short.Int.Long 和 Char 类型统称为整数类型,整数类型加上 Float 和 Double 统称为数 ...
- Mysql如何添加外键,如何实现连表查询
创建表student和表score,表student设置主键,表score设置表student中属性相同的为外键: 创建student表 create table student ( id int p ...
- 一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!
不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...
- XHTML 和 HTML 中的 iframe
1. XHTML 有什么? XHTML是更严谨更纯净的HTML版本. 2.HTML和XHTML之间的差异 ①XHTML元素必须被正确的嵌套 /!--错误写法--/ <p><i> ...
- Docker笔记(九):网络管理
Docker的应用运行在容器中,其相互之间或与外部之间是如何通信的,涉及到哪些知识点,本文对相关内容进行整理.因网络这块牵涉的面较多,因此只从日常使用或理解的角度出发,过于专业的就不深入探讨了. 1. ...
- CF1198E Rectangle Painting 2(最小割 思维
这个题主要是转化为最小割的思路不好想到. 大意:给你一个大的正方形,有的点黑,有的点白,要把黑染白,你每次可以选一个矩形染色,代价是min(长,宽),问最小代价. 思路:对于一个要染色的块来说,他要被 ...