OAuth2密碼模式已死匪凉,最先進的Spring Cloud認(rèn)證授權(quán)方案在這里

舊的Spring Security OAuth2停止維護已經(jīng)有一段時間了式矫,99%Spring Cloud微服務(wù)項目還在使用這些舊的體系,嚴(yán)重青黃不接预明。很多同學(xué)都在尋找新的解決方案缩赛,甚至還有念念不忘密碼模式的。胖哥也在前面寫了一篇解決思路的文章撰糠。好像還是不過癮酥馍,今天看到這篇文章的同學(xué)有福了,問題將在這里得到解決阅酪。

方案

目前這應(yīng)該是Spring生態(tài)中最新的解決方案旨袒,沒有之一汁针。先看下流程,微服務(wù)無關(guān)的其它的組件這里先屏蔽了砚尽,剩下圖的幾個組件:

詳細(xì)流程為

  • ①用戶向網(wǎng)關(guān)請求登錄或者通過網(wǎng)關(guān)請求資源服務(wù)器的資源施无。

  • ②網(wǎng)關(guān)發(fā)現(xiàn)用戶沒有授權(quán)發(fā)起基于OAuth2授權(quán)碼的OIDC流程,向授權(quán)服務(wù)器Id Server發(fā)起授權(quán)請求必孤。

  • ③授權(quán)服務(wù)器Id Server收到授權(quán)請求重定向到用戶登錄頁面要求用戶登錄認(rèn)證帆精,以發(fā)起授權(quán)。

  • ④用戶輸入用戶名密碼進行登錄認(rèn)證隧魄。

  • Id Server授權(quán)服務(wù)器處理用戶認(rèn)證并重定向到網(wǎng)關(guān)約定的OAuth2 Redirect URI,這個過程屬于標(biāo)準(zhǔn)的OIDC授權(quán)碼流程隘蝎。

  • ⑥網(wǎng)關(guān)獲得AccessTokenIdToken

    • 如果最初發(fā)起的是登錄就重定向到/购啄。
    • 如果最初發(fā)起的是請求資源服務(wù)器資源就令牌中繼重定向到對應(yīng)的資源。
  • 資源服務(wù)器通過⑦⑧兩個鏈路響應(yīng)用戶的請求嘱么。

請注意狮含,上述流程中生成的AccessTokenIdToken不允許提供給用戶側(cè),否則會引起中間人攻擊曼振,默認(rèn)提供的是一個cookie策略几迄,大部分情況下這種策略是夠用的,如果你需要自定義必須深刻了解其機制冰评,你可以通過我的Spring Security OAuth2專欄進行學(xué)習(xí)映胁。

具體實現(xiàn)

根據(jù)上面的方案,我們需要三個應(yīng)用甲雅,分別是網(wǎng)關(guān)Spring Cloud Gateway應(yīng)用解孙、資源服務(wù)器應(yīng)用Resource ServerOAuth2授權(quán)服務(wù)器Id Server

Spring Cloud Gateway

Spring Cloud Gateway 應(yīng)用抛人,端口8080弛姜,它不僅僅是一個網(wǎng)關(guān)還是一個在授權(quán)服務(wù)器Id Server注冊的OAuth2客戶端,通過Id Server你可以在一分鐘內(nèi)完成配置妖枚。它需要配置到資源服務(wù)器的路由規(guī)則和令牌中繼功能廷臼。核心配置為:

spring:
  application:
    name: gateway
  security:
    oauth2:
      client:
        registration:
          # 這里為客戶端名稱可自行更改
          gatewayclient:
            client-id: e4da4a32-592b-46f0-ae1d-784310e88423
            # 密碼為注冊客戶端時的密碼
            client-secret: secret
            # 只能選擇一個
            redirect-uri: http://127.0.0.1:8080/login/oauth2/code/gatewayclient
            # 其它兩種方式為refresh_token,client_credentials
            authorization-grant-type: authorization_code
            client-authentication-method: client_secret_basic
            scope: message.write,userinfo,message.read,openid
        provider:
          gatewayclient:
            # 要保證授權(quán)服務(wù)器地址可以被客戶端訪問
            issuer-uri: http://localhost:9000
  cloud:
    gateway:
      routes:
        - id: resource-server
          uri: http://127.0.0.1:8084
          predicates:
            - Path=/res/**
          filters:
            - TokenRelay

Resource Server

資源服務(wù)器就是我們平常編寫的業(yè)務(wù)接口的服務(wù)器,端口這里定義為8084绝页,它需要集成Spring Security及其Resource Server組件荠商。它要負(fù)責(zé)定義資源接口的訪問權(quán)限,例如:

         // 只有message.read才有資格訪問資源/res/foo
        httpSecurity.authorizeRequests()
                .antMatchers("/res/foo").hasAnyAuthority("SCOPE_message.read")
 

另外它還要和授權(quán)服務(wù)器Id Server通訊獲取AccessToken的解碼公鑰:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: http://localhost:9000/oauth2/jwks

獲取解碼公鑰的原理在我的Spring Security OAuth2專欄有詳細(xì)介紹续誉,這里不再贅述结啼。

Id Server

倉庫地址:https://github.com/NotFound403/id-server 歡迎star,歡迎貢獻屈芜。

Id Server是一個基于Spring Authorization Server的開源的授權(quán)服務(wù)器郊愧,它大大降低OAuth2授權(quán)服務(wù)器的學(xué)習(xí)使用難度朴译,提供UI控制臺,動態(tài)權(quán)限控制属铁,方便OAuth2客戶端管理眠寿,可一鍵生成Spring Security配置,開箱即用焦蘑,少量配置修改就可部署盯拱,代碼開源,方便二次開發(fā)例嘱,支持OAuth2四種客戶端認(rèn)證方式和三種授權(quán)模式狡逢。它是目前Spring安全生態(tài)中重要的組成部分,也是未來的技術(shù)發(fā)展趨勢拼卵,更多信息請參閱Id Server項目倉庫的介紹奢浑。

Id Server在本文扮演的是OAuth2授權(quán)服務(wù)器的角色,負(fù)責(zé)對授權(quán)請求進行處理腋腮,維護客戶端注冊信息雀彼,授權(quán)用戶信息,后續(xù)會加入IDP支持即寡,各種三方登錄的用戶也可以動態(tài)在這里進行登錄徊哑,就像這樣:

聯(lián)合登錄

根據(jù)業(yè)務(wù)需要第三方OAuth2授權(quán)登錄也能優(yōu)雅的接入,當(dāng)然聪富,接入的登錄方式需要OIDC或者OAuth2的支持莺丑。

DEMO以及使用方法

上述完整DEMOId Server的倉庫中的samples下。使用方法:

  • 拉取Id Server項目并加載依賴墩蔓。
  • IntelliJ IDEA中依次單獨對samples文件夾下的所有項目的pom.xml進行右鍵菜單選中Add As Maven Project窒盐,這一步很重要。
  • 依次啟動Id Server钢拧、gateway蟹漓、resource-server三個項目。

測試登錄

  • 瀏覽器訪問http://127.0.0.1:8080/login源内,點擊http://localhost:9000葡粒。
  • 輸入用戶名密碼user/user
  • 能查看到認(rèn)證信息就證明成功了膜钓,再次重申嗽交,在生產(chǎn)中該信息十分敏感,不應(yīng)該直接對前端暴露颂斜。
  • 瀏覽器訪問http://127.0.0.1:8080/res/foo夫壁,可以訪問到資源服務(wù)器的資源。

另一種測試

關(guān)閉瀏覽器重新打開沃疮,瀏覽器訪問http://127.0.0.1:8080/res/foo盒让,你看看會發(fā)生什么梅肤?

總結(jié)

通過OAuth2客戶端、Spring Cloud Gateway邑茄、OAuth2授權(quán)服務(wù)器姨蝴、OAuth2資源服務(wù)器的聯(lián)動,你會發(fā)現(xiàn)授權(quán)碼模式也可以實現(xiàn)完整的微服務(wù)認(rèn)證授權(quán)肺缕,而且比密碼模式更加安全左医。后續(xù)Id Server實現(xiàn)了聯(lián)合登錄之后,其它第三方登錄也可以無縫集成進來同木。多多關(guān)注浮梢,更多先進的黑科技等著你。

關(guān)注公眾號:碼農(nóng)小胖哥彤路,獲取更多資訊

個人博客:https://felord.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秕硝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斩萌,更是在濱河造成了極大的恐慌,老刑警劉巖屏轰,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颊郎,死亡現(xiàn)場離奇詭異,居然都是意外死亡霎苗,警方通過查閱死者的電腦和手機姆吭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唁盏,“玉大人内狸,你說我怎么就攤上這事±謇蓿” “怎么了昆淡?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長刽严。 經(jīng)常有香客問我昂灵,道長,這世上最難降的妖魔是什么舞萄? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任眨补,我火速辦了婚禮,結(jié)果婚禮上倒脓,老公的妹妹穿的比我還像新娘撑螺。我一直安慰自己,他們只是感情好崎弃,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布甘晤。 她就那樣靜靜地躺著含潘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪安皱。 梳的紋絲不亂的頭發(fā)上调鬓,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音酌伊,去河邊找鬼腾窝。 笑死,一個胖子當(dāng)著我的面吹牛居砖,可吹牛的內(nèi)容都是我干的虹脯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼奏候,長吁一口氣:“原來是場噩夢啊……” “哼循集!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蔗草,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤咒彤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咒精,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镶柱,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年模叙,在試婚紗的時候發(fā)現(xiàn)自己被綠了歇拆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡范咨,死狀恐怖故觅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渠啊,我是刑警寧澤输吏,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站替蛉,受9級特大地震影響评也,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灭返,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一盗迟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熙含,春花似錦罚缕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黔衡。三九已至,卻和暖如春腌乡,著一層夾襖步出監(jiān)牢的瞬間盟劫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工与纽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侣签,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓急迂,卻偏偏與公主長得像影所,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子僚碎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容