* * [功能簡介](#功能簡介)
* [sso對接](#sso對接)
* [服務端配置](#服務端配置)
* [客戶端配置](#客戶端配置)
* [單點登錄測試用例](#單點登錄測試用例)
* [鎖定應用](#鎖定應用)
* [正常應用](#正常應用)
* [問題總結](#問題總結)
* [報錯二:](#報錯二)
* [測試用例](#測試用例)
## 一、功能簡介
auth-sso是一個單點功能,這個系統是`auth-sever`的一個客戶端服務。
## 二、sso對接
auth-sso應與auth-server的對接。
### [](#服務端配置)服務端配置

### [](#客戶端配置)客戶端配置
> 在客戶端應有一個客戶端秘鑰的配置: 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-源碼調試:
繼續調試,但是在拋出的異常中能看到`stateKey`:
- 簡介
- 更新說明
- 其他作品
- 第一部分 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