概念理解
授權(quán)碼模式:用戶訪問應(yīng)用A,點(diǎn)擊微信授權(quán)登錄,跳轉(zhuǎn)至微信的登錄頁(yè)面,輸入用戶名和密碼,選擇授權(quán),則返回AccessToken給應(yīng)用A,應(yīng)用A拿著這個(gè)AccessToken在后臺(tái)調(diào)用微信提供的接口,獲取用戶信息,自動(dòng)注冊(cè)成為應(yīng)用A的用戶?!敬颂幍目蛻舳撕褪跈?quán)服務(wù)器分屬不同的公司所有】
密碼模式:該模式一般用于APP或者Web端用戶登錄,用戶輸入網(wǎng)站的賬號(hào)和密碼提交給客戶端,客戶端將用戶名+密碼+client_id+client_secret 提交給授權(quán)服務(wù)器獲取AccessToken【此時(shí)的客戶端和授權(quán)服務(wù)器都隸屬于同一家公司所有】。
- JWT和OAuth2 :JWT可以理解為一種加密方式,使用自定義加密的信息,而OAuth2則是一種認(rèn)證授權(quán)的協(xié)議規(guī)范,有授權(quán)碼模式、密碼模式、客戶端模式、簡(jiǎn)化模式。
- Spring-Security-OAuth2 :以Spring為主體而衍生的一個(gè)框架,用于搭建認(rèn)證授權(quán)服務(wù)器。
1、實(shí)現(xiàn)存儲(chǔ)OAuth2生成的AccessToken的多種方式【此處是指存儲(chǔ)AccessToken的多種方式,比如Mysql存儲(chǔ)、Redis存儲(chǔ),無存儲(chǔ)的JWT實(shí)現(xiàn)】
2、搭建資源服務(wù)器、客戶端、認(rèn)證授權(quán)服務(wù)器的相關(guān)實(shí)現(xiàn)類,簡(jiǎn)化用戶代碼實(shí)現(xiàn)。
授權(quán)碼模式(授權(quán)碼登錄流程)
1、用戶進(jìn)入網(wǎng)站的登錄頁(yè)面,選擇第三方登錄(如微信、QQ等),
2、進(jìn)入登錄頁(yè)面A,選擇微信登錄。
3、進(jìn)入微信的登錄授權(quán)頁(yè)面。
4、用戶輸入自己微信的賬號(hào)和密碼,點(diǎn)擊確認(rèn),登錄認(rèn)證成功。
5、進(jìn)入授權(quán)頁(yè)面,選擇授權(quán)。
6、調(diào)轉(zhuǎn)至指定的url并攜帶code值
7、后端接口處理code,調(diào)用對(duì)應(yīng)的第三方接口,獲取AccessToken成功后,繼續(xù)獲取用戶信息,并自動(dòng)注冊(cè)成為Web的用戶
8、上一步驟成功后,進(jìn)入Web主頁(yè)。
密碼模式(用戶密碼登錄流程)
1、用戶進(jìn)入網(wǎng)站的登錄頁(yè)面
2、輸入網(wǎng)站的用戶名和密碼
3、封裝用戶名和密碼,攜帶網(wǎng)站在授權(quán)服務(wù)器注冊(cè)申請(qǐng)到的client_id和client_secret信息,提交給授權(quán)服務(wù)器 oauth2-server 獲取AccessToken
4、獲取成功
項(xiàng)目地址
項(xiàng)目初始化和運(yùn)行
1、初始化數(shù)據(jù)庫(kù)文件:OAuth2文件/初始化數(shù)據(jù)庫(kù)/initDataBase.sql
2、host添加映射:
127.0.0.1 www.newbee.cn ###客戶端
127.0.0.1 www.v5.cn ### 資源和認(rèn)證授權(quán)服務(wù)器
3、啟動(dòng) oauth2-server、oauth2-resource、oauth2-client
密碼模式案例測(cè)試
密碼模式流程:
1、獲取AccessToken:訪問oauth2-client的swagger2地址【http://www.newbee.cn:8052/oauth2-client/swagger-ui.html#/】,使用默認(rèn)swagger2的數(shù)據(jù),點(diǎn)擊try,將獲取AccessToken
2、為請(qǐng)求添加頭信息:訪問oauth2-resource的swagger2地址【http://www.v5.cn:8051/oauth2-resouce/swagger-ui.html#/】,使用步驟1獲取的AccessToken數(shù)據(jù),點(diǎn)擊右上角的 Authorize 按鈕,在彈出框的提示符 api_key輸入框內(nèi)輸入 Bearer AccessToken值【Bearer+空格+AccessToken】
3、調(diào)用資源服務(wù)器的接口:點(diǎn)擊oauth2-resource的swagger2地址中的各個(gè)接口地址,
3.1、比如點(diǎn)擊接口:authenticated/roleAllowed/admin,該接口需要權(quán)限:ROLE_ADIMIN
返回結(jié)果:{ "error": "unauthorized","error_description": "Full authentication is required to access this resource"
5.2、比如點(diǎn)擊接口:authenticated/roleAllowed/member,該接口需要權(quán)限:ROLE_MEMBER
返回結(jié)果:success
用戶擁有權(quán)限:ROLE_MEMBER,而沒有:ROLE_ADIMIN
授權(quán)碼模式案例測(cè)試
授權(quán)碼模式測(cè)試流程:
1、瀏覽器打開鏈接地址【http://www.newbee.cn:8052/oauth2-client/login.html】
2、點(diǎn)擊授權(quán)登錄鏈接,將訪問【http://www.v5.cn:8050/oauth2-server/oauth/authorize?client_id=wechat_client_id&redirect_uri=http://www
.newbee.cn:8052/oauth2-client/thirdLogin/WeChat&response_type=code&scope=read】
3、授權(quán)服務(wù)器oauth2-server重定向至登錄頁(yè)面【http://www.v5.cn:8050/oauth2-server/login】
3、在頁(yè)面輸入用戶名和密碼:username e10adc3949ba59abbe56e057f20f883e,點(diǎn)擊login按鈕
4、認(rèn)證成功,進(jìn)入【http://www.v5.cn:8050/oauth2-server/oauth/authorize?client_id=wechat_client_id&redirect_uri=http://www
.newbee.cn:8052/oauth2-client/thirdLogin/WeChat&response_type=code&scope=read】點(diǎn)擊Authorize按鈕。
5、瀏覽器URL【http://www.newbee.cn:8052/oauth2-client/thirdLogin/WeChat?code=aOMzEi】,頁(yè)面顯示AccessToken值:{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsib2F1dGgyLXJlc291cmNlIl0sInNhbHQiOiIxMjM0NTYiLCJ1c2VyX25hbWUiOiJ1c2VybmFtZSIsInNjb3BlIjpbInJlYWQiXSwiZXhwIjoxNTQ4NzMxNTM4LCJhdXRob3JpdGllcyI6WyJST0xFX01FTUJFUiJdLCJqdGkiOiIyYjY1YzY4Ni0zZDQwLTQyNGItODgwOC03ZWExODg4NWU1ZWEiLCJjbGllbnRfaWQiOiJ3ZWNoYXRfY2xpZW50X2lkIn0.zQPiP3ds1uBcmoRp4cGPDrUf24KowAhQsG8751m-Erw","refreshToken":"2b65c686-3d40-424b-8808-7ea18885e5ea","expiresIn":599,"scope":"read"}
個(gè)人理解
SpringCloud的OAuth2理解:
用戶身份用密碼模式,比如APP、Web的用戶登錄。
微服務(wù)客戶端之間的API調(diào)用使用客戶端模式,比如Feign客戶端調(diào)用。
AccessToken將在header中攜帶,弄成可配置的形式。
具體可以參考微服務(wù)的腳手架JHipster的實(shí)現(xiàn),其采用的是定義了一個(gè) @AuthorizedFeignClients注解。
參考鏈接
OAuth2授權(quán)
spring-oauth-server 數(shù)據(jù)庫(kù)表說明
Spring Security 入門系列
從零開始的Spring Security OAuth2
關(guān)于 Token,你應(yīng)該知道的十件事