OAuth2.0说明文档
OAuth2.0说明文档
1、OAuth 2.0 简介
OAuth为应用提供了一种访问受保护资源的方法。在应用访问受保护资源之前,它必须先从资源拥有者处获取授权(访问许可),然后用访问许可交换访问令牌(代表许可的作用域、持续时间和其它属性)。应用通过向资源服务器出示访问令牌来访问受保护资源。
下图中的名词说明
Resource Owner:用户
User-Agent:浏览器
Client:应用服务器
Authorization Server:认证服务器(用户信息存放服务的认证服务器)
Resource Server:资源服务器(用户真正信息存放的服务器,需要通过access_token进行访问)
Web-Hosted Client Resource:web托管的客户端资源(这个确切的说,我也不知道叫啥才适合)
OAuth2.0服务支持以下5种获取Access Token的方式:(图片来源:OAuth2.0协议草案 )
1.1、APP密钥模式(Client Credentials Flow)
直接使用app密钥,不另作说明

1.2、Resource Owner Password Credentials Flow
直接使用用户密码,不另作说明

1.3、Authorization Code Flow
授权码模式

流程简单表述为,当用户访问应用服务器
(A)应用服务器返回带有授权信息的重定向链接,浏览器拿到链接,转为访问认证服务器(见下面:获取Authorization Code)
(B)认证服务器提供界面给用户进行确认授权,用户确认授权
(C)用户确认授权后,认证服务器返回带有code的重定向链接,浏览器拿到链接,转为访问应用服务器
(D)应用服务器拿到code,访问认证服务器(见下面:通过Authorization Code获取Access Token)
(E)认证服务器验证后,返回access_token给应用服务器
授权码是应用弹出窗口,并将用户引导到授权服务器,传入标识符、请求作用域、本地状态,和一个重定向URI。授权服务器验证用户,获得授权,然后用重定向URI引导回应用,并传回授权码给应用。因为终端用户只在授权服务器上进行验证,所以终端用户的用户名和密码从来不用分享给应用。
获取Authorization Code
|
参数名 |
必选 |
介绍 |
|
client_id |
True |
创建应用时获得的App Key |
|
response_type |
True |
此值固定为“code” |
|
redirect_uri |
True |
授权后要回调的URI,即接收Authorization Code的URI, 其值可以是“oob”。 非“oob”值的redirect_uri所在域名必须与开发者注册应用时所提供的回调地址的域名相匹配 |
|
scope |
False |
以空格分隔的权限列表,若不传递此参数,代表请求默认的basic权限。(目前只有basic权限) |
|
state |
False |
hash,用于预防CSRF,用于保持请求和回调的状态,授权服务器在重定向到“redirect_uri”时,会在Query Parameter中原样回传该参数 |
/authorize?client_id=ABCDEFGHIJKLMNOP&response_type=code&redirect_uri=http://www.example.com/oauth_redirect&scope=basic&state=mytest
如果用户在此页面同意授权,则将重定向用户浏览器到指定的“redirect_uri”,并附带上表示授权服务所分配的Authorization Code的code参数(假设为“0987654321“),以及state参数(如果有),验证通过后,认证服务器将重定向用户浏览器到“http://www.example.com/oauth_redirect?state=mytest&code=0987654321”
说明:每一个Authorization Code的有效期为60秒(可根据需求调长一些,但原则上应尽可能短),并且只能使用一次,再次使用将无效。
通过Authorization Code获取Access Token
通过上面第一步获得Authorization Code后,便可以用其向认证服务器换取一个Access Token。
|
参数名 |
必选 |
介绍 |
|
grant_type |
True |
此值固定为“authorization_code” |
|
code |
True |
通过上面第一步所获得的Authorization Code |
|
client_id |
True |
创建应用时获得的App Key |
|
client_secret |
True |
应用的App Secret |
|
redirect_uri |
True |
redirect_uri所在域名必须与开发者注册应用时所提供的回调地址的域名匹配 |
/access_token?grant_type=authorization_code&code=0987654321&client_id=ABCDEFGHIJKLMNOP&client_secret=abcdefg...&redirect_uri=http://www.example.com/oauth_redirect
若参数无误,服务器将返回一段JSON文本,包含以下参数:
|
参数名 |
必选 |
介绍 |
|
access_token |
True |
获取的Access Token |
|
token_type |
False |
令牌类型“bearer”或“mac”,暂无很明确的说明,通常是brearer或省略 |
|
expires_in |
True |
Access Token的有效期,以秒为单位 |
|
refresh_token |
False |
用于刷新Access Token 的 Refresh Token |
|
scope |
False |
Access Token最终的访问范围,即用户实际授予的权限列表,用户在授权页面时,有可能会取消掉某些请求的权限,通常只作或只有登录认证的话,可忽略 |
示例:Content-Type: application/json
{"access_token":"uuvvwwxxyyzz","expires_in":"3600", "scope":"basic","refresh_token":"qwertyuiop"}
1.4、Implicit Grant Flow
简化模式,该模式下,通常client和user-agent是在一起的,如手机app等

流程简单表述为,当用户访问应用服务
(A)应用服务返回带有授权信息的重定向链接,浏览器拿到链接,转为访问认证服务器
(B)认证服务器提供界面给用户进行确认授权,用户确认授权
(C)假设资源所有者授予访问权限,则认证服务器返回带有获取access_token的令牌的链接
(D)浏览器链接重定向到一个web客户端资源,访问资源服务器
(E)返回一个网页(通常是一个嵌入式脚本的HTML文档)
(F)浏览器从脚本中提取access_token(包括其他参数)
(G)浏览器带着access_token重定向到应用服务器,应用服务器到浏览器传来的access_token
采用Implicit Grant方式获取Access Token的授权验证流程又被称为User-Agent Flow,适用于所有无Server端配合的应用(由于应用往往位于一个User Agent里,如浏览器里面,因此这类应用在某些平台下又被称为Client-Side Application),如手机/桌面客户端程序、浏览器插件等,以及基于JavaScript等脚本语言实现的应用。
1.5、Refreshing an Expired Access Token
令牌刷新方式,适用于所有有Server端配合的应用,其实就是更新access_token

获取Access Token,都会拿到有效期为14天的Refresh Token,和2分钟有效期的Access Token。对于这些应用,只要用户在14天内登录,应用就可以使用Refresh Token获得新的Access Token。
要使用Refresh Token获得新的Access Token,需要应用在其服务端发送请求(推荐用POST方法)到开放平台OAuth2.0授权服务的以下地址: “/access_token”,并带上以下参数:
|
参数名 |
必选 |
介绍 |
|
grant_type |
True |
必须为“refresh_token” |
|
refresh_token |
True |
用于刷新Access Token用的Refresh Token |
|
client_id |
True |
创建应用时获得的App Key |
|
client_secret |
True |
应用的App Secret |
|
scope |
False |
以空格分隔的权限列表,若不传递此参数,代表请求默认的basic权限。注:通过Refresh Token刷新Access Token时所要求的scope权限范围必须小于等于上次获取Access Token时授予的权限范围 |
示例:
/access_token?grant_type=refresh_token&refresh_token=qwertyuiop&client_id=ABCDEFGHIJKLMNOP&client_secret=abcdefg...&scope=basic
若请求成功服务器将返回一段JSON文本,包含以下参数
示例:Content-Type: application/json
{ "access_token":"uuvvwwxxyyzz","expires_in":"120","scope":"basic","refresh_token":" qwertyuiop"}
2、使用access_token调用API
获取access_token以后,就可以使用access_token调用API接口。
调用API的URL“/json”传递需要的参数,参数的详细介绍请参照以上描述
例:/json?access_token=uuvvwwxxyyzz
OAuth2.0说明文档的更多相关文章
- OAuth2.0理解和用法
现在网络的资料到处都是,很容易搜索到自己想要的答案.但答案通常只能解决自己一部分的问题.如果自己想要有一套自己的解决方案,还得重新撸一遍靠谱. 我需要学下OAuth2.0吗? 没看之前以为OAuth2 ...
- SWFUpload 2.5.0版 官方说明文档 中文翻译版
原文地址:http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html#setFileUploadLimit SWFUpload v2 ...
- 如何使用Swagger为.NET Core 3.0应用添加JWT授权说明文档
简介 本教程采用WHY-WHAT-HOW黄金圈思维模式编写,黄金圈法则强调的是从WHY为什么学,到WHAT学到什么,再到HOW如何学.从模糊到清晰的学习模式.大家的时间都很宝贵,我们做事前先想清楚为什 ...
- NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因
认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...
- OAuth2.0学习(1-11)新浪开放平台微博认证-使用OAuth2.0调用微博的开放API
使用OAuth2.0调用API 使用OAuth2.0调用API接口有两种方式: 1. 直接使用参数,传递参数名为 access_token URL 1 https://api.weibo.com/2/ ...
- Asp.netCore 3.0 Web 实现Oauth2.0微信授权登陆的测试
1:Oauth2.0授权的流程截图 官方流程如下: 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果 ...
- 深入理解OAuth2.0协议
1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...
- OAuth2.0 四种授权模式
OAuth2.0简单笔记(四种授权模式) 金天:坚持写东西,不是一件容易的事,换句话说其实坚持本身都不是一件容易的事.如果学习有捷径,那就是不断实践,不断积累.写笔记,其实是给自己看的,是体现积累的一 ...
- 微信公众平台开发——微信授权登录(OAuth2.0)
1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...
随机推荐
- [CC]LOD技术
ccGLWindow::paintGL() | ccGLWindow::fullRenderingPass(...) | ccGLWindow::drawBackground(context, ren ...
- 自定义EL表达式的函数
编写描述的tld文件放到web-inf/目录下,才能在jsp页面上调用 <?xml version="1.0" encoding="UTF-8" ?> ...
- TPS04-J. 使用线程池时确保ThreadLocal变量每次都初始化
线程池可以提供这种保障,一旦你的代码开始执行了,被分配来执行这个task的线程在执行完你的task之前不会做别的事情. 所以不用担心执行到一半被别的task改了 thread local 的变量. 由 ...
- GPS部标平台的架构设计(一)
设计和开发一个GPS系统似乎并不太难,很多人马上就想到了地图,放大,缩小之类的功能,最多就是在加点报表之类的东西,就成了. 这种观点造成了业界内,很多GPS系统粗制滥造,不堪大用. 事实上,设计和开发 ...
- nodejs学习心得
其实这次软件工程的微信公众号大作业对我来说是一个很大的挑战? 为什么这么说呢?因为我的基础太差了,实话说,到现在,c语音,java这些我恐怕就只能打出个hello world 自己太懒了,不想去学.这 ...
- 关于baseflight cleanflight naze32不能解锁的办法
需要修改源代码,重新编译.. mcfg.mincheck = 1150; mcfg.maxcheck = 1850; 当然,这是笨方法.还有个办法设置解锁检查的最大最小油门 在控制台,也就是 CLI那 ...
- spring 配置bean
Main(测试方法) public class Main { public static void main(String[] args) { //1.创建Spring 的IOC容器对象: //spr ...
- HUD 5050 Divided Land
http://acm.hdu.edu.cn/showproblem.php?pid=5050 题目大意: 给定一个矩形的长和宽,把这个矩形分成若干相等的正方形,没有剩余.求正方形的边长最长是多少. 解 ...
- Javascript模块化编程(二):AMD规范(转)
这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...
- Node.js Express 框架
Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...