OAuth2.0

OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。客户端来申请资源,资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。也就是说,OAuth 的核心就是向第三方应用颁发令牌。而且,OAuth 2.0 规定了四种获得令牌的流程。你可以选择最适合自己的那一种,向第三方应用颁发令牌。

具体的OAuth学习建议仔细研读阮一峰的教程,

  • http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

下面我们来使用spring cloud security 和 spring cloud oauth2两个组件来简单实现授权流程。

授权服务

下面我们来使用spring cloud security 实现一个授权服务,首先来引入依赖:

除了一个web组件,只引入了一个spring-cloud-starter-oauth2,这是因为spring cloud下的oauth2组件已经包含了security:

首先写一个正常的登录功能,application配置文件和启动类都不用增加特殊配置,主要来配置security配置类:

这里面基本没有特殊的配置,都是前面遇到过的熟悉的配置。有了这个配置类,基本的登录功能就有了,要想有授权功能,还需要一个授权配置类,授权配置类需要继承 AuthorizationServerConfigurerAdapter 类,并引入 @EnableAuthorizationServer 注解:

首先配置一个客户端:

然后配置token的存储和管理,此处使用secret作为秘钥,后面会介绍使用非对称加密的方式 :

上面的token存储在了内存中,token也可以存储在数据库或者redis中。最后配置授权端点的访问控制:

以上就是一个简答的授权服务。

资源服务

下面来搭建一个资源服务,其实授权和资源服务是可以合二为一的,此处为了清晰,将它们分开。pom中引入的依赖和授权服务是一样的,同样,配置文件和启动类不需要做特殊配置。首先来写两个简单的接口,一个定义为受保护,另一个不受保护:

然后定义一个资源服务配置类,需要继承 ResourceServerConfigurerAdapter 类,并引入 @EnableResourceServer 注解:

首先来看令牌验证的配置:

然后来看接口资源的拦截规则:

save开头的可以直接访问,不会被拦截,/user/save接口会被验证。

注意上面配置的clientId和secret都是单一的配置死的,如果需要对多客户端动态进行认真,需要重写,后面是通过http调用的方式解析访问令牌(主要是通过访问授权服务的/oauth/check_token解析)。

测试

我们来根据前面说到的流程测试,首先向授权服务申请一个授权码:

  • http://localhost:8015/oauth/authorize?client_id=clientId&response_type=code&redirect_uri=http://localhost:8015/

访问首先会跳转到登录页面:

输入配置中默认的用户名密码登录,然后进入下一个页面:

这个页面是真正的授权页面,选择Approve,点击按钮,同意授权,授权码会通过回调地址获取,如下图:

然后携带授权码申请访问令牌,需要访问下面的地址(需要使用post方式):

  • http://localhost:8015/oauth/token?grant_type=authorization_code&code=授权码&redirect_uri=http://localhost:8015/&client_id=clientId&client_secret=secret

将授权码替换上面地址中的授权码三个字,然后在postman中访问:

其返回结果中,包含access_token参数,就是我们需要的访问令牌,token_type 参数说明了令牌的类型,一般类型为bearer或者refresh_token可以在访问令牌过期后向授权服务申请新的令牌,expires_in参数是令牌的有效时间,单位是秒,图中显示默认是12个小时。令牌已经得到了,下面来访问资源接口,首先试一下不受保护的资源:

可以看到直接就能访问,然后访问受保护的资源接口:

得到这样的结果说明该接口需要认证,我们来使用我们前面得到的令牌来访问,首先选择正确的认真协议:

然后在右侧填写前面获取的access_token:

然后访问接口,就能看到受保护的资源通过令牌可以访问:

代码地址 : https://gitee.com/blueses/spring-boot-security 15 和 16

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例的更多相关文章

  1. SpringBootSecurity学习(14)前后端分离版之 OAuth2.0介绍

    登录总结 前面基本介绍了security的常规用法,同时介绍了JWT和它的一个简单实现,基本上开发中遇到的登录问题都能解决了,即使在分布式开发,或者微服务开发中实现登录也基本没有问题了.securit ...

  2. SpringBootSecurity学习(16)前后端分离版之 OAuth2.0 加密配置

    示例代码的改进 前面使用spring cloud security和spring cloud oauth2写了一个第三方授权的例子,例子非常的简单,主要目的是用来熟悉OAuth2.0 申请授权的整个流 ...

  3. SpringBootSecurity学习(17)前后端分离版之 OAuth2.0 数据库(JDBC)存储客户端

    自动批准授权码 前面我们授权的流程中,第一步获取授权码的时候,都会经历一个授权是否同意页面: 这个流程就像第三方登录成功后,提问是否允许获取昵称和头像信息的页面一样,这个过程其实是可以自动同意的,需要 ...

  4. SpringBootSecurity学习(19)前后端分离版之OAuth2.0 token的存储和管理

    内存中存储token 我们来继续授权服务代码的下一个优化.现在授权服务中,token的存储是存储在内存中的,我们使用的是 InMemoryTokenStore : 图中的tokenStore方法支持很 ...

  5. SpringBootSecurity学习(23)前后端分离版之OAuth2.0 其它模式

    密码模式 前面介绍了授权码模式和刷新令牌两种获取最新令牌的方法,下面来看一下其它模式.首先看密码模式,我们默认配置的三种模式中其实就包含密码模式的支持: 因此我们启动项目,直接使用密码模式即可,访问地 ...

  6. SpringBootSecurity学习(20)前后端分离版之OAuth2.0刷新token

    刷新token 前面的例子和配置都是从头开始申请授权码和令牌,现在来看一下如何根据获取令牌时,回参中的 refresh_token 来刷新令牌.现在在项目中配置的是内存模式的默认用户名密码,第一步先改 ...

  7. SpringBootSecurity学习(21)前后端分离版之OAuth2.0非对称加密

    JWT转换器 前面的例子中,都是在授权服务配置类中配置了一个很简单的jwt转换器,如下: 可以看到我们只用setSigningKey方法配置了一个秘钥,这里使用的是简单的对称加密的方式来加密jwt内容 ...

  8. SpringBootSecurity学习(22)前后端分离版之OAuth2.0自定义授权码

    使用JDBC维护授权码 前面的代码中,测试流程第一步都是获取授权码,然后再携带授权码去申请令牌,授权码示例如下: 产生的授权码默认是 6 位的,产生以后并没有做任何管理,可以说是一个临时性的授权码,o ...

  9. SpringBootSecurity学习(24)前后端分离版之OAuth2.0 应用登记

    应用登记 一个应用要求 OAuth 授权,必须先到对方网站登记,让对方知道是谁在请求.举个例子,下面是github的登记页面: https://github.com/settings/applicat ...

随机推荐

  1. Angular Material 的设计之美

    前言 Angular Material 作为 Angular 的官方组件库,无论是设计交互还是易用性都有着极高的质量.正如官方所说其目的就是构建基于 Angular 和 Typescript 的高质量 ...

  2. 那些让你觉得自己是个傻B的题目集锦(大神的降维打击合集)

    一起过来排好队,进来挨打 1.Leetcode tag-LinkList 109.convert sorted list to binary search tree 2Leetcode tag-Arr ...

  3. 2019nc#3

    题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A Graph Games 点击查看 进入讨论 18/292 未通过 B Crazy Binary String 点击查看 1107/3615 ...

  4. CQ18阶梯赛第二场

    H国的身份证号码I HihoCoder - 1558 只要单纯的判断一下前后的乘积就好了, 因为不是很想处理倍数的关系, 所以我这里是用 string去处理. 代码: #include<bits ...

  5. 牛客暑假多校 F RIKKA with Line Graph

    题意: 现在有一副完全图, 将他转化成线图. 线图就是 把原来的图上的边都变成点, 然后如果原来的任意2条边存在公共点, 他们就会有一条边, 边权为原来的2条边的和. 最后求出线图中的任意2点的最短路 ...

  6. Python---网络爬虫初识

    1. 网络爬虫介绍 来自wiki的介绍: 网络爬虫(英语:web crawler),也叫网上蜘蛛(spider),是一种用来自动浏览万维网的网络机器人. 但是我们在写网络爬虫时还要注意遵守网络规则,这 ...

  7. Go 语言基础——变量常量的定义

    go语言不支持隐式类型转换,别名和原有类型也不能进行隐式类型转换 go语言不支持隐式转换 变量 变量声明 var v1 int var v2 string var v3 [10]int // 数组 v ...

  8. 讲解开源项目:让你成为灵魂画手的 JS 引擎:Zdog

    本文作者:HelloGitHub-kalifun HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  9. 花果山第一届猿类分级考试实录--Talk is cheap,Show me the code

    本故事纯属虚构,如有雷同,纯属巧合! 故事背景 悟空师徒4人取经回来后,因不耐收到管教,就回到了花果山,带领一帮猴子猴孙逍遥自在的过日子,奈何因在阎王殿里将生死薄中的猴子猴孙的名字都划去了,猴子猴孙是 ...

  10. springmvc request foward 和 redirect

    ---恢复内容开始--- 最近在实现那个学生信息录入的时候,先是在添加学生的页面添加完,然后想直接调用Conroller层遍历学生的方法,我的意思就是在contoller一个方法怎么直接调用另外一个方 ...