java B2B2C Springboot电子商务平台源码-SSO单点登录之OAuth2.0登录认证
之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点:
一、oauth中的角色
client:调用资源服务器API的应用
Oauth 2.0 Provider:包括Authorization Server和Resource Server
(1)Authorization Server:认证服务器,进行认证和授权
(2)Resource Server:资源服务器,保护受保护的资源
user:资源的拥有者
二、下面详细介绍一下Oauth 2.0 Provider
Authorization Server:
(1)AuthorizationEndpoint:进行授权的服务,Default URL: /oauth/authorize
(2)TokenEndpoint:获取token的服务,Default URL: /oauth/token
Resource Server:
OAuth2AuthenticationProcessingFilter:给带有访问令牌的请求加载认证
三、下面再来详细介绍一下Authorization Server:
一般情况下,创建两个配置类,一个继承AuthorizationServerConfigurerAdapter,一个继承WebSecurityConfigurerAdapter,再去复写里面的方法。
主要出现的两种注解:
1、@EnableAuthorizationServer:声明一个认证服务器,当用此注解后,应用启动后将自动生成几个Endpoint:(注:其实实现一个认证服务器就是这么简单,加一个注解就搞定,当然真正用到生产环境还是要进行一些配置和复写工作的。)
/oauth/authorize:验证
/oauth/token:获取token
/oauth/confirm_access:用户授权
/oauth/error:认证失败
/oauth/check_token:资源服务器用来校验token
/oauth/token_key:如果jwt模式则可以用此来从认证服务器获取公钥
以上这些endpoint都在源码里的endpoint包里面。
2、@Beans:需要实现AuthorizationServerConfigurer
AuthorizationServerConfigurer包含三种配置:
ClientDetailsServiceConfigurer:client客户端的信息配置,client信息包括:clientId、secret、scope、authorizedGrantTypes、authorities
(1)scope:表示权限范围,可选项,用户授权页面时进行选择
(2)authorizedGrantTypes:有四种授权方式
Authorization Code:用验证获取code,再用code去获取token(用的最多的方式,也是最安全的方式)
Implicit: 隐式授权模式
Client Credentials (用來取得 App Access Token)
Resource Owner Password Credentials
(3)authorities:授予client的权限
这里的具体实现有多种,in-memory、JdbcClientDetailsService、jwt等。
AuthorizationServerSecurityConfigurer:声明安全约束,哪些允许访问,哪些不允许访问
AuthorizationServerEndpointsConfigurer:声明授权和token的端点以及token的服务的一些配置信息,比如采用什么存储方式、token的有效期等
client的信息的读取:在ClientDetailsServiceConfigurer类里面进行配置,可以有in-memory、jdbc等多种读取方式。
jdbc需要调用JdbcClientDetailsService类,此类需要传入相应的DataSource.
下面再介绍一下如何管理token:
AuthorizationServerTokenServices接口:声明必要的关于token的操作
(1)当token创建后,保存起来,以便之后的接受访问令牌的资源可以引用它。
(2)访问令牌用来加载认证
接口的实现也有多种,DefaultTokenServices是其默认实现,他使用了默认的InMemoryTokenStore,不会持久化token;
token存储方式共有三种分别是:
(1)InMemoryTokenStore:存放内存中,不会持久化
(2)JdbcTokenStore:存放数据库中
(3)Jwt: json web token
授权类型:
可以通过AuthorizationServerEndpointsConfigurer来进行配置,默认情况下,支持除了密码外的所有授权类型。相关授权类型的一些类:
(1)authenticationManager:直接注入一个AuthenticationManager,自动开启密码授权类型
(2)userDetailsService:如果注入UserDetailsService,那么将会启动刷新token授权类型,会判断用户是否还是存活的
(3)authorizationCodeServices:AuthorizationCodeServices的实例,auth code 授权类型的服务
(4)implicitGrantService:imlpicit grant
(5)tokenGranter:
endpoint的URL的配置:
(1)AuthorizationServerEndpointsConfigurer的pathMapping()方法,有两个参数,第一个是默认的URL路径,第二个是自定义的路径
(2)WebSecurityConfigurer的实例,可以配置哪些路径不需要保护,哪些需要保护。默认全都保护。
自定义UI:
(1)有时候,我们可能需要自定义的登录页面和认证页面。登陆页面的话,只需要创建一个login为前缀名的网页即可,在代码里,设置为允许访问,这样,系统会自动执行你的登陆页。此登陆页的action要注意一下,必须是跳转到认证的地址。
(2)另外一个是授权页,让你勾选选项的页面。此页面可以参考源码里的实现,自己生成一个controller的类,再创建一个对应的web页面即可实现自定义的功能。
下面梳理一下授权获取token流程:
(1)端口号换成你自己的认证服务器的端口号,client_id也换成你自己的,response_type类型为code。
localhost:8080/uaa/oauth/authorize?client_id=client&response_type=code&redirect_uri=http://www.baidu.com
(2)这时候你将获得一个code值:http:www.baidu.com/?code=G0C20Z
(3)使用此code值来获取最终的token:
curl -X POST -H “Cant-Type: application/x-www-form-urlencoded” -d ‘grant_type=authorization_code&code=G0C20Z&redirect_uri=http://www.baidu.com’ “http:client:secret@localhost:8080/uaa/oauth/token”
返回值:
{“access_token”:“b251b453-cc08-4520-9dd0-9aedf58e6ca3”,“token_type”:“bearer”,“expires_in”:2591324,“scope”:“app”}
(4)用此token值来调用资源服务器内容(如果资源服务器和认证服务器在同一个应用中,那么资源服务器会自己解析token值,如果不在,那么你要自己去做处理)
curl -H “Authorization: Bearer b251b453-cc08-4520-9dd0-9aedf58e6ca3” “localhost:8081/service2(此处换上你自己的url)”
四、Resource Server:保护资源,需要令牌才能访问
在配置类上加上注解@EnableResourceServer即启动。使用ResourceServerConfigurer进行配置:
(1)tokenServices:ResourceServerTokenServices的实例,声明了token的服务
(2)resourceId:资源Id,由auth Server验证。
(3)其它一些扩展点,比如可以从请求中提取token的tokenExtractor
(4)一些自定义的资源保护配置,通过HttpSecurity来设置
使用token的方式也有两种:
(1)Bearer Token(https传输方式保证传输过程的安全):主流
(2)Mac(http+sign)
如何访问资源服务器中的API?
如果资源服务器和授权服务器在同一个应用程序中,并且您使用DefaultTokenServices,那么您不必太考虑这一点,因为它实现所有必要的接口,因此它是自动一致的。如果您的资源服务器是一个单独的应用程序,那么您必须确保您匹配授权服务器的功能,并提供知道如何正确解码令牌的ResourceServerTokenServices。与授权服务器一样,您可以经常使用DefaultTokenServices,并且选项大多通过TokenStore(后端存储或本地编码)表示。
(1)在校验request中的token时,使用RemoteTokenServices去调用AuthServer中的/auth/check_token。
(2)共享数据库,使用Jdbc存储和校验token,避免再去访问AuthServer。
(3)使用JWT签名的方式,资源服务器自己直接进行校验,不借助任何中间媒介。
五、oauth client
在客户端获取到token之后,想去调用下游服务API时,为了能将token进行传递,可以使用RestTemplate.然后使用restTemplate进行调用Api。
注:
scopes和authorities的区别:
scopes是client权限,至少授予一个scope的权限,否则报错。
authorities是用户权限。
以上是我从网上找到的一篇写的不错的博客,希望可以帮助大家快速了解OAuth2.0,下一篇文章我们正式介绍OAuth2.0在当前框架中的使用。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JavaScript大师必须掌握的12个知识点
译者按: 前端技术涉及的越来越多! 原文: 10 things to learn on the way to becoming a JavaScript Master 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。 既然你对这篇文章感兴趣,我想你应该是一位前端开发,也许你有一份不错的工作、自主创业甚至是一位自由从业者。不知你的前端技术如何,也许你是一位新手,亦或是一位资深开发。如果你想让自己成为一个 JavaScript 大师,在此我列出 12 条必备知识: 1. 控制流(Control Flow) 我们从最基础的开讲。当然,它也是最重要的一个知识点。如果你连这个都没有整明白的话,那你的代码生活将会很艰难。 if else : 如果连这个都不知道,之前怎么码代码的? switch : 当有很多的情况要处理(>2)的时候,用它准没错。 for: 不要去编写重复的代码,请使用 for。for of和for in都十分便利。一个很大的优势在于 for 循环是阻塞式的,可以配合async await使用。 高阶的条件语句: 使...
- 下一篇
【PHP系列直播】深入理解 FastCGI 协议以及在 PHP 中的实现
直播地址 https://yq.aliyun.com/live/956 直播时间 2019年4月9日 20:00 主讲人 周梦康(楚松)点击关注专家阿里云资深研发工程师,《深入 PHP 内核》作者之一 内容提要 传统 CGI 工作原理分析客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求,服务器端的 HTTP Daemon(守护进程)将 HTTP 请求里描述的信息通过标准输入 stdin 和环境变量(environment variable)传递给主页指定的 CGI 程序,并启动此应用程序进行处理(包括对数据库的处理),处理结果通过标准输出 stdout 返回给 HTTP Daemon 守护进程,再由 HTTP Daemon 进程通过 HTTP 协议返回给客户端。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Red5直播服务器,属于Java语言的直播服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装