綜述:上兩回講了密碼模式,應該是淺顯易懂。若有補充,不足或者是有誤之處還請多多指出。如今重頭戲,受權碼模式開始。java
1、具體操做流程spring
- 用戶訪問客戶端,後者將前者導向認證服務器,認證服務器返回認證頁面(帳號密碼或者其餘認證方式)
- 用戶選擇是否給予客戶端受權。
- 假設用戶給予受權,認證服務器將用戶導向客戶端事先指定的"重定向URI"(redirection URI),同時附上一個受權碼。
- 客戶端收到受權碼,附上早先的"重定向URI",向認證服務器申請令牌。這一步是在客戶端的後臺的服務器上完成的,對用戶不可見。
- 認證服務器覈對了受權碼和重定向URI,確認無誤後,向客戶端發送訪問令牌(access token)和更新令牌(refresh token)。
2、實踐測試瀏覽器
一樣是使用上回使用的認證服務器。記得將資源配置註釋掉。服務器
(1)在瀏覽器訪問認證服務器獲取 code:http://localhost:8001/oauth/authorize?client_id=client&response_type=code&scope=all&redirect_uri=http://www.baidu.com (get), 結果以下:spring-boot
認證服務器會重定向到 login 頁面讓用戶進行登陸受權。此時用戶輸入用戶名和密碼進行受權。成功以後認證服務器重定向到指定的 url (這裏爲 www.baidu.com):post
(2)在重定向的 url 後面會帶上 code,此時客戶端則能夠拿這個 code 去換取 token,換取鏈接:http://localhost:8001/oauth/token?client_id=client&client_secret=123456&grant_type=authorization_code&redirect_uri=http://www.baidu.com&code=AKAQUe (post)
測試
(3)跟上回說的那樣,拿到 token 便可訪問資源了ui
問題總結:
url
(1)Java.io.NotSerializableException Problem (UserDetails的實現類沒有實現Serializable接口致使 )spa
(2)User account is locked (isAccountNonLocked 屬性設置爲了false,應該設置爲true)
(3)解決Spring Security OAuth在訪問/oauth/token時候報401 authentication is required(解決參考:https://blog.csdn.net/u012040869/article/details/80140515)
參考資料:
(1)四中模式概述:https://blog.csdn.net/weixin_42033269/article/details/80086422
(2)userDetailsService:https://www.journaldev.com/2736/spring-security-example-userdetailsservice
(3)spring security Oauth 2.0 authentication server example: https://javadeveloperzone.com/spring-boot/spring-security-oauth-2-0-authentication-server/#26_Demo
(4)OAuth2 tables: https://stackoverflow.com/questions/34170281/spring-boot-oauth2-with-jdbc-token-store-gives-oauth-access-token-relation-doesn
(5)受權碼模式:http://www.javashuo.com/article/p-kkpdiwgd-ba.html
(6)Spring Boot OAuth2.0密碼模式:http://www.javashuo.com/article/p-hodekdhc-a.html
後續:由此史上最簡潔Springboot2.0 + OAuth2.0 暫時告一段落。。。