| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring Security OAuth2简介 -> 正文阅读 |
|
[Java知识库]Spring Security OAuth2简介 |
本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。 OAuth2简介? ? ? OAuth是一个开放标准,该标准允许用户让第三方应用访问该用户在某一个网站上存储的私密资源(如头像、照片、视频等),并且在这个过程中无须将用户的账号/密码提供给第三方应用。通过令牌(token)可以实现这一功能,每一个令牌授权一个特定的网站在特定的时间段内允许访问特定的资源。 ? ? ? ? OAuth让用户可以授权第三方网站灵活访问他们存储在另外一些资源服务器上的特定信息,而非所有内容。对于用户而言,我们在互联网应用中最常见的OAuth应用就是各种第三方登录,例如QQ授权登录、微信授权登录、微博授权登录等等。 ? ? ? ? 例如,用户想要通过QQ登录今日头条,这时今日头条就是一个第三方应用,今日头条需要访问用户存储在QQ服务器上的一些基本信息,就需要得到用户的授权。如果用户把自己的QQ账号和密码告诉今日头条,那么今日头条就能访问用户存储在QQ服务器上的所有数据,并且用户只有修改了密码才能收回权限,这种授权方式安全隐患很大,如果使用OAuth协议就能很好的解决这一问题。?? OAuth2的四种授权模式? ? ? ? OAuth2协议一共支持四种不同的授权模式:
? ? ? ? ?从图中我们可以看出OAuth2中包含四种不同的角色:
授权码模式? ? ? ? 授权码模式(Authorization Code)是最安全且使用最广泛的一种OAuth2授权模式,同时也是最复杂的一种授权模式,其具体的授权流程如下: ? ? ? ? ?整个流程图看起来有点复杂,这里结合王松老师的一个案例来学习:假设现在想给www.javaboy.org这个网站引入Github第三方登录功能,如果使用OAuth2协议中的授权码模式,那么流程应该是这样的: ? ? ? ? 首先www.javaboy.org这个网站相当于一个第三方应用,该网站的首页上会放置一个登陆连接,用户(服务方的用户,这里指的是Github用户)单击这个连接,就会请求授权服务器(这里指的是Github授权服务器)。 ????????www.javaboy.org网站首页的登录超链接可能是下面这样的: ? ? ? ? 这个连接中的参数比较多,我们一一解释下:
? ? ? ?当用户单击登录超链接时,系统会将用户导入授权服务器的登录页 面;用户选择是否给予授权;如果用户同意授权,则授权服务器会将页面 重定向到redirect_uri指定的地址,同时携带一个授权码参数(如果一开 始的链接提供了state参数,这里也会将state参数原封不动返回);获取到的授权码,再结合自有 的client_id和grant_type、redirect_uri等参数,向授权服务器请求令牌, 这一步是在客户端的后端进行的,对用户不可见;授权服务器对参数进行校验之后,会返回Access Token和 Refresh Token。 ????????这就是授权码模式的工作流程。一般认为授权码模式是四种模式中 最安全的一种模式,因为这种模式的Access Token不用经过浏览器或者 移动端App,是直接从项目的后端获取,并从后端发送到资源服务器 上,这样就很大程度上减少了Access Token泄漏的风险。 简化模式? ? ? ? 对于没有后端只有页面的网站,如果想要第三方功能该怎么办呢?这就是该小结要学习的简化模式(Implicit),流程如下: ? ? ? ? 首先在www.javaboy.org网站上有一个Github第三方登录的超链接,这个链接如下:
https://github.com/oauth/authorize?response_type=token&client_id=javaboy&redi
rect_uri=www.javaboy.org&scope=all&state=123
? ? ? ? 这里的参数和授权码模式中的参数基本相同,只有response_type的参数值不一样,这里是token,表示要求授权服务器直接返回AccessToken。和授权码相比,这里省略了授权码那一步。
? ? ? ? 当用户点击了登录超链接,系统会将用户导入授权服务器的登录页面。用户选择是否给与授权,如果用户同意授权则授权服务器会将页面重定向到redirect_uri指定的地址,同时在重定向的URL中添加锚点参数携带AccessToken,如下:
http://localhost:8082/index.html#access_token=9fda1800-3b57-4d32-ad01-05ff700
d44cc&token_type=bearer&expires_in=1940&state=123
这里采用锚点参数而不是URL地址参数,主要是为了避免中间人攻 击,其中token_type表示令牌类型,expires_in表示令牌过期时间,这对 应了图15-3中所示的步骤C。 接下来客户端向资源服务器发送请求,这个请求不需要携带令牌, 这对应了图15-3中所示的步骤D;资源服务器返回一段JS脚本,这对应 了图15-3中所示的步骤E;客户端执行JS脚本,提取出令牌Access Token,这对应了图15-3中所示的步骤F、步骤G。 这就是简化模式的工作流程,它的弊端很明显,因为没有后端,所 以非常不安全,除非对安全性要求不高,否则不建议使用。
???????????????
密码模式? ? ? ? 使用密码模式(Password)有一个前提就是高度信任第三方应用,只有高度信任第三方应用,才可以让用户在第三方应用的页面上输入登录凭证。下图是密码模式的流程: ? ? ? ? 首先用户在第三方应用的登录页面输入登录凭证(用户名/密码)。第三方应用将用户的登录信息发送给授权服务器,获取到令牌AccessToken。授权服务器检查用户的登录信息,如果没有问题则返回AccessToken和RefreshToken。? 客户端模式? ? ? ? 有的应用可能没有前端页面,只有一个后台,这种时候如果要使用OAuth2,就可以考虑客户端模式(Client Credtials)。流程如下: ? ? ? ? 客户端模式的流程很简单,只有两个步骤:
由于客户端模式是以客户端的名义向授权服务器请求令牌,所以授权服务器的令牌AccessToken颁发给客户端而非用户。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/22 18:17:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |