paulwong

          使用REST API與KEYCLOAK進行OUATH2協(xié)議的登錄認(rèn)證

          KEYCLOAK是一套用戶、WEB API登錄管理,授權(quán)管理的WEB應(yīng)用。
          如果要訪問受KEYCLOAK保護的REST API服務(wù),則需要夾帶一個ACCESS_TOKEN。

          前端頁面:
          • 前端頁面一般是給用戶使用的,則需要用戶輸入在KEYCLOAK中有效的用戶名和密碼,并提供CALL BAK的URL,提交給KEYCLOAK
            http://10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/auth?client_id=app-springboot-confidential&redirect_uri=http://10.80.27.69:8183/&response_type=code&scope=openid
          • 如果KEYCLOAK驗證通過,則通知頁面重導(dǎo)向回調(diào)的URL,并附上code=xxx,此code則是AUTHORIZATION_CODE
            http://10.80.27.69:8183/?session_state=2ad9ab98-6c39-43a8-872f-2112c27b74df&code=3f48ce19-58f9-45d9-8c09-30d492bf4b24.2ad9ab98-6c39-43a8-872f-2112c27b74df.bd7526ef-b1bf-447f-baef-b7dfd6f0df93
          • 回調(diào)的URL對應(yīng)的SERVELET,取得AUTHORIZATION_CODE,并加上client_id和client_secrect,調(diào)用KEYLOAK的取ACCESS_TOKEN的HTTP API,取得ACCESS_TOKEN,返回給頁面
            http://10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/token
            client_id=app-springboot-confidential&client_secret=3acf7692-49cb-4c45-9943-6f3dba512dae&redirect_uri=http://10.80.27.69:8183/&grant_type=authorization_code&code=cc7ac566-90f9-404e-b88e-fa28037b07d1.591311e1-5380-46a2-9363-834f17337922.bd7526ef-b1bf-447f-baef-b7dfd6f0df93
          • 頁面保存此ACCESS_TOKEN,就可以調(diào)用后臺的各種API獲取數(shù)據(jù)
            {
                "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJGSjg2R2NGM2pUYk5MT2NvNE52WmtVQ0lVbWZZQ3FvcXRPUWVNZmJoTmxFIn0.eyJleHAiOjE2MzQwMjA4ODksImlhdCI6MTYzNDAyMDU4OSwianRpIjoiNDAwOTQ4ZmQtMGU0MS00YWRjLTlhY2MtMzczZWM2NDVhNzM5IiwiaXNzIjoiaHR0cDovLzEwLjgwLjI3LjY5OjgxODAvYXV0aC9yZWFsbXMvcXVpY2tzdGFydCIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJkZGVkMDA2YS0xY2QxLTRjODUtOTQ1MS0wMjFlZmY3OTFiMmUiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJhcHAtc3ByaW5nYm9vdC1jb25maWRlbnRpYWwiLCJzZXNzaW9uX3N0YXRlIjoiYzRlN2QzYTgtMDg2My00OTAwLTkxZmEtMGExYmFmYmRlNGU3IiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYXBwLXNwcmluZ2Jvb3QtY29uZmlkZW50aWFsIjp7InJvbGVzIjpbInVtYV9wcm90ZWN0aW9uIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImNsaWVudElkIjoiYXBwLXNwcmluZ2Jvb3QtY29uZmlkZW50aWFsIiwiY2xpZW50SG9zdCI6IjEwLjEwLjIwLjU3IiwidXNlcl9uYW1lIjoic2VydmljZS1hY2NvdW50LWFwcC1zcHJpbmdib290LWNvbmZpZGVudGlhbCIsInByZWZlcnJlZF91c2VybmFtZSI6InNlcnZpY2UtYWNjb3VudC1hcHAtc3ByaW5nYm9vdC1jb25maWRlbnRpYWwiLCJjbGllbnRBZGRyZXNzIjoiMTAuMTAuMjAuNTcifQ.Ut6aZ6E1d4Esz0gRv2ubxdvrxmGvZLHHZepD5pnGxlqb_yZ4Q82TdGTG0iL4JJn2NH3QAU501dhzzuv6-OT9BUBKP-4ufyKv2DxSvt3GgdN30au5JsATHFyOWuuZGRBd3iWcynf9u3OJnSkHEnrIwRYatgndLzy8dy3AeqF12CI",
                "expires_in": 300,
                "refresh_expires_in": 600,
                "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI2MTlhMmJjOS0yMWIwLTRmNGMtODI4OC1kNTJmMjA3OWEzY2EifQ.eyJleHAiOjE2MzQwMjExODksImlhdCI6MTYzNDAyMDU4OSwianRpIjoiYTM0NTQ1MTYtMzc3NC00YmRlLTgzOTMtN2QyMTdkZjdkZmJkIiwiaXNzIjoiaHR0cDovLzEwLjgwLjI3LjY5OjgxODAvYXV0aC9yZWFsbXMvcXVpY2tzdGFydCIsImF1ZCI6Imh0dHA6Ly8xMC44MC4yNy42OTo4MTgwL2F1dGgvcmVhbG1zL3F1aWNrc3RhcnQiLCJzdWIiOiJkZGVkMDA2YS0xY2QxLTRjODUtOTQ1MS0wMjFlZmY3OTFiMmUiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoiYXBwLXNwcmluZ2Jvb3QtY29uZmlkZW50aWFsIiwic2Vzc2lvbl9zdGF0ZSI6ImM0ZTdkM2E4LTA4NjMtNDkwMC05MWZhLTBhMWJhZmJkZTRlNyIsInNjb3BlIjoicHJvZmlsZSBlbWFpbCJ9.QhjkJBGz5UvwBF7xHM7_V_yjfF0lrA_EWzAVdFf-BRI",
                "token_type": "bearer",
                "not-before-policy": 0,
                "session_state": "c4e7d3a8-0863-4900-91fa-0a1bafbde4e7",
                "scope": "profile email"
            }
          • 這就是authorization_code流程

          后端服務(wù):
          • 如果是在一個API中要請求另外一個API的數(shù)據(jù),不存在具體用戶的情況
          • 需提供如下參數(shù):client_id、client_secrect和grant_type,且grant_type=client_credentials,調(diào)用KEYLOAK的取ACCESS_TOKEN的HTTP API,取得ACCESS_TOKEN
            http://10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/token
            client_id=app-springboot-confidential&client_secret=3acf7692-49cb-4c45-9943-6f3dba512dae&grant_type=client_credentials
          • 再將此ACCESS_TOKEN以Bearer TOKEN的方式調(diào)用別的的API
          • 這就是client_credentials流程

          驗證Access Token和獲取Token元信息:
          • http://10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/token/introspect
            client_id=app-springboot-confidential&client_secret=3acf7692-49cb-4c45-9943-6f3dba512dae
          • Access Token無效時返回:
            {
                "active": false
            }

          刷新Token:
          • http://10.80.27.69:8180/auth/realms/quickstart/protocol/openid-connect/token
            client_id=app-springboot-confidential&client_secret=3acf7692-49cb-4c45-9943-6f3dba512dae&grant_type=refresh_token&refresh_token=asdfasd
          • 返回
            {
                "access_token": "eyJhbGciOiJSUzI1NiIsIn",
                "expires_in": 300,
                "refresh_expires_in": 1800,
                "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOi",
                "token_type": "Bearer",
                "not-before-policy": 1610728470,
                "session_state": "c1273eb5-f922-420c-b23a-854be9735c1d",
                "scope": "profile email"
            }



          Reference:
          https://blog.csdn.net/nklinsirui/article/details/112706006

          https://www.baeldung.com/?s=keycloak

          https://www.doag.org/formes/pubfiles/11143470/2019-NN-Sebastien_Blanc-Easily_Secure_your_Microservices_with_Keycloak-Praesentation.pdf




          posted on 2021-10-12 14:40 paulwong 閱讀(791) 評論(0)  編輯  收藏 所屬分類: OAUTH2KEYCLOAK

          主站蜘蛛池模板: 慈溪市| 洞头县| 永寿县| 云梦县| 宁都县| 敦煌市| 瑞金市| 永昌县| 福州市| 南郑县| 云龙县| 安吉县| 崇义县| 依兰县| 新昌县| 乌拉特后旗| 石泉县| 襄樊市| 远安县| 定陶县| 昌乐县| 汤原县| 云南省| 黄大仙区| 新蔡县| 鸡东县| 宁明县| 曲沃县| 毕节市| 大连市| 噶尔县| 鄂托克旗| 班玛县| 安新县| 南召县| 上思县| 和政县| 阿图什市| 桦甸市| 商洛市| 威信县|