* * [功能简介](#功能简介)
* [sso对接](#sso对接)
* [服务端配置](#服务端配置)
* [客户端配置](#客户端配置)
* [单点登录测试用例](#单点登录测试用例)
* [锁定应用](#锁定应用)
* [正常应用](#正常应用)
* [问题总结](#问题总结)
* [报错二:](#报错二)
* [测试用例](#测试用例)
## 一、功能简介
auth-sso是一个单点功能,这个系统是`auth-sever`的一个客户端服务。
## 二、sso对接
auth-sso应与auth-server的对接。
### [](#服务端配置)服务端配置
![image](https://s3.ax1x.com/2020/12/15/rK3R7F.png?ynotemdtimestamp=1608128738913)
### [](#客户端配置)客户端配置
> 在客户端应有一个客户端秘钥的配置: auth-sso中`application.yml`的配置内容为:
~~~
security:
ignored: /,/favicon.ico,/home.html,/dashboard.html,/js/**,/css/**,/webjars/**
sessions: ALWAYS
user:
password: 123456
oauth2:
sso:
login-path: /dashboard/login
client:
client-id: owen
client-secret: owen
user-authorization-uri: http://127.0.0.1:9200/api-auth/oauth/authorize #直接配置认证中心端口(http://127.0.0.1:9200/oauth/authorize),也可以配置网关端口
access-token-uri: http://127.0.0.1:9200/api-auth/oauth/token #直接配置认证中心端口(http://127.0.0.1:9200/oauth/authorize),也可以配置网关端口
resource:
# user-info-uri: http://127.0.0.1:8000/auth/users #返回认证服务器检查
# prefer-token-info: false
token-info-uri: http://127.0.0.1:9200/api-auth/oauth/check_token #直接配置认证中心端口(http://127.0.0.1:9200/oauth/authorize),也可以配置网关端口
prefer-token-info: true
~~~
## 三、单点登录测试用例
访问地址:[http://127.0.0.1:9997/dashboard/](http://127.0.0.1:9997/dashboard/)
### [](#锁定应用)锁定应用
锁定应用“owen”。 访问sso主页,auth-server返回:
~~~
[auth-server:169.254.80.80:8000] [f55fce2e23409855,f55fce2e23409855] 2020-12-15 11:20:53.685 ERROR 15308 [http-nio-8000-exec-8] com.open.capacity.uaa.server.service.RedisClientDetailsService clientId:owen,owen
[auth-server:169.254.80.80:8000] [f55fce2e23409855,f55fce2e23409855] 2020-12-15 11:20:53.685 ERROR 15308 [http-nio-8000-exec-8] com.open.capacity.uaa.server.service.RedisClientDetailsService clientId:owen,owen
[auth-server:169.254.80.80:8000] [f55fce2e23409855,f55fce2e23409855] 2020-12-15 11:20:53.686 INFO 15308 [http-nio-8000-exec-8] org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint Handling OAuth2 error: error="invalid_client", error_description="应用获取失败"
~~~
浏览器返回:
> OAuth Error error="unsupported\_response\_type", error\_description="??????", code="400", msg="??????"
该日志信息是由org.springframework.security.oauth2.common.exceptions.OAuth2Exception返回的。
### [](#正常应用)正常应用
## 四、问题总结
client端无法登录,auth-server报错:
~~~
[auth-server:169.254.80.80:8000] [7af92e2ba3037cf2,7af92e2ba3037cf2] 2020-12-15 14:03:59.606 WARN 18032 [http-nio-8000-exec-9]
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder Empty encoded password
~~~
原因分析:
> 刚好看到一篇博文:[《Spring Security 中的 BCryptPasswordEncoder加密、验证策略》](https://blog.csdn.net/u013019701/article/details/110249239)
应用owen的原始加密秘钥为:`$2a$10$a1ZEXiZQr604LN.wVxet.etPm6RvDs.HIaXP48J2HKRaEnZORTVwe`。 在系统中进行保存后,生成新的秘钥为:`$2a$10$.t/BRbvOwUsK5RS4.Jfnnu1BO6M3tthLGdM4o9KqPX3/SKjRy6Xoy`。很明显二者的加密算法是不一致的,作者真是神坑啊。
源码分析:
~~~
matches:112, BCryptPasswordEncoder (org.springframework.security.crypto.bcrypt)
matches:592, WebSecurityConfigurerAdapter$LazyPasswordEncoder (org.springframework.security.config.annotation.web.configuration)
additionalAuthenticationChecks:90, DaoAuthenticationProvider (org.springframework.security.authentication.dao)
authenticate:166, AbstractUserDetailsAuthenticationProvider (org.springframework.security.authentication.dao)
authenticate:175, ProviderManager (org.springframework.security.authentication)
~~~
### [](#报错二)报错二:
~~~
{
"msg": "Failed to handle request [GET http://127.0.0.1:9200/api-auth/oauth/authorize?client_id=owen&redirect_uri=http://127.0.0.1:9997/dashboard/login&response_type=code&state=lhzdiY]: 503 SERVICE_UNAVAILABLE \"Unable to find instance for auth-server\"",
"code": 404
}
~~~
【出错原因】以上报错是auth-server和auth-sso刚刚重启后会出现,原因是这两个服务重新启动后,需要在nacos中完成服务注册,nacos需要一点点时间确认服务可用才会向外暴露。
OAuth2客户端登录:
获取token:org.springframework.security.oauth2.client.OAuth2RestOperations#getAccessToken
## [](#测试用例)测试用例
> 场景:在已登录过的前提下,再次点击login;调试到该位置会报错。
> 报错位置:`/org/springframework/security/oauth2/client/token/grant/code/AuthorizationCodeAccessTokenProvider.java:204`
错误描述:request的size显示为0,但是resource中是有数据的。如图:
1-源码调试:![](https://i0.hdslb.com/bfs/album/408a4ed694d8bca56966b7efea42df2ded019912.png@1e_1c.webp?ynotemdtimestamp=1608128738913)
继续调试,但是在抛出的异常中能看到`stateKey`:![](https://i0.hdslb.com/bfs/album/85c2fb6f825004a1db96a1f8922a24ef8c0255c3.png@1e_1c.webp?ynotemdtimestamp=1608128738913)
- 简介
- 更新说明
- 其他作品
- 第一部分 Java框架基础
- 第一章 Java基础
- 多线程实战
- 尝试一下Guava带返回值的多线程处理类ListenableFuture
- LocalDate和Date有什么区别
- JAVA8接口增强实践
- 第二章 Spring框架基础
- MVC究竟是个啥?
- @ApiImplicitParam
- 七种方式,教你在SpringBoot初始化时搞点事情!
- Spring事务状态
- maven
- Mybatis小总结
- mybatis-plus的使用
- 第三章 SpringSecurity实战
- 基于SpringSecurity+jwt的用户认证
- spring-security-oauth2
- 第四章 数据库
- mysql
- mysql授权
- mysql数据库三个关键性能指标--TPS\QPS\IOPS
- 梳理一下那些年Mysql的弱语法可能会踩的坑
- 关于Mysql的“字符串”数值的转换和使用
- 凭这一文咱把事务讲透
- Mysql性能优化
- 查询性能优化
- 不常用的一些语法
- elasticsearch
- elasticsearch文档操作
- 索引的基本操作
- java操作ElaticSearch
- elasticsearch中的各种查询
- DB与ES混合应用可能存在的问题及解决方案探索
- 使用es必须要知道的一些知识点:索引篇
- Es中的日期操作
- MongoDB
- 入门篇(了解非关系型数据库 NoSQL - MongoDB)
- 集群分片 (高级篇)
- 互联网大厂的建表规范
- 第五章 中间件
- nginx
- nginx动静分离配置,这个雷你踩过吗?
- Canal
- Sharding-jdbc
- 水平分库实践
- kafka
- 第六章 版本管理
- git
- Not currently on any branch 情况提交版本
- 第七章 IO编程
- 第八章 JVM实战调优
- jvisualvm
- jstat
- 第二部分 高级项目实战篇
- 第一章 微信开发实战
- 第二章 文件处理
- 使用EasyExcel处理导入导出
- 第三章 踩坑指南
- 邮件发送功能
- 第三部分 架构实战篇
- 第一章 架构实战原则
- 接口防止重复调用的一种方案
- 第二章 高并发缓存一致性管理办法
- 第三章 异地多活场景下的数据同步之道
- 第四章 用户体系
- 集成登录
- auth-sso的管理
- 第五章 分库分表场景
- 第六章 秒杀与高并发
- 秒杀场景
- 第七章 业务中台
- 中台的使用效果是怎样的?
- 通用黑白名单方案
- 第八章 领域驱动设计
- 第十一章 微服务实战
- Nacos多环境管理之道
- logback日志双写问题及Springboot项目正确的启动方式
- 第四部分 优雅的代码
- java中的链式编程
- 面向对象
- 开发原则
- Stream操作案例分享
- 注重性能的代码
- 第五部分 谈谈成长
- 新手入门指北
- 不可不知的调试技巧
- 构建自己的知识体系
- 我是如何做笔记的
- 有效的提问
- 谨防思维定势
- 学会与上级沟通
- 想清楚再去做
- 碎片化学习
- 第六部分 思维导图(付费)
- 技术基础篇
- 技术框架篇
- 数据存储篇
- 项目实战篇
- 第七部分 吾爱开源
- 7-1 麻雀聊天
- 项目启动
- 前端登录无请求问题解决
- websocket测试
- 7-2 ocp微服务框架
- evm框架集成
- 项目构建与集成
- zentao-center
- 二次开发:初始框架的搭建
- 二次开发:增加细分菜单、权限到应用
- 7-3 书栈网
- 项目启动
- 源码分析
- 我的书架
- 文章发布机制
- IM
- 第八章 团队管理篇
- 大厂是怎么运作的
- 第九章 码山有道
- 简历内推
- 联系我内推
- 第十章 学点前端
- Vue