如何訪問被Keycloak保護的后端API


后端項目集成Keycloak之后我們是無法直接訪問后端的接口或者頁面的。此時必須先獲取到token然后攜帶着token去訪問接口。
本篇我們講述兩種獲取token然后請求的方式

  1. 使用HTTP請求獲取token
  2. 使用Postman的認證工具

一、使用HTTP請求獲取token

后端集成keycloak時,我們一般會把訪問類型設置為confidential或者bearer-only類型的;前端項目一般是需要設置為public類型。

在后端正確地集成了Keycloak,並把訪問類型設置為bearer-only之后,我們就可以通過下面的url獲取token:

POST http://{ServerUrl}:8080/auth/realms/{realm}/protocol/openid-connect/token

其中需要輸入你當前keycloak服務器的URL地址,realm需要設置成你后端項目所在的realm名。
配置好URL之后我們需要填寫表單參數。這里需要說明下,我此處只使用了Password credentials方式獲取token,也就是使用用戶名密碼去獲取token的方式。此方式需要四個參數:

參數名 參數值
grant_type password
username {你的用戶名}
password {你的密碼}
client_id 你keycloak域中訪問類型為public的client_id

這里grant_type的值是固定的,寫password就可以。用戶名密碼是你當前realm中用戶的賬戶和密碼。這里最重要的是client_id。大部分剛接觸keycloak的開發人員會以為這里填寫我訪問的client就可以了。其實這是不對的。
bearer-only訪問類型的后端是沒有登錄界面的,因此我們需要一個public的客戶端來獲取token。
這里順帶提一句,如果你的后端是非前后端分離的項目,那你應該把客戶端設置成public類型。

假定你現在有兩個客戶端,一個叫fronted,一個叫backend。那么獲取token時,你應該使用fronted這個客戶端獲取發送token請求。下面是一個樣例:

{
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0NE81OGVoNldXTG13NTdiSXNZMjdNTWR1bUg0dW9oMlVQeFhMS1UtUWFVIn0.eyJqdGkiOiJmZTA2ZjMzZS0yOWRmLTQ4MTItYWFkNi1mYzY3ZDhhYTIwNjQiLCJleHAiOjE1ODU0ODk5NDIsIm5iZiI6MCwiaWF0IjoxNTg1NDg4NzQyLCJpc3MiOiJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjpbInVzZXItY2VudGVyIiwidGVzdC1yZWFsbSIsIm1hc3Rlci1yZWFsbSIsImFjY291bnQiLCJhaW9wcy1yZWFsbSJdLCJzdWIiOiIwZTZlNzBiOS02ZWNmLTRiNjAtOWUxYy1kZDVhMzk0YWNlNTMiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJhaW9wcy13ZWIiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiJkYWZkZTA2Ny00ZjFlLTQ2NjQtOTFhNC02NmIwNDZmMDZmZGIiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImNyZWF0ZS1yZWFsbSIsIm9mZmxpbmVfYWNjZXNzIiwiYWRtaW4iLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7InVzZXItY2VudGVyIjp7InJvbGVzIjpbInN1cGVyX3JvbGUiXX0sInRlc3QtcmVhbG0iOnsicm9sZXMiOlsidmlldy1pZGVudGl0eS1wcm92aWRlcnMiLCJ2aWV3LXJlYWxtIiwibWFuYWdlLWlkZW50aXR5LXByb3ZpZGVycyIsImltcGVyc29uYXRpb24iLCJjcmVhdGUtY2xpZW50IiwibWFuYWdlLXVzZXJzIiwicXVlcnktcmVhbG1zIiwidmlldy1hdXRob3JpemF0aW9uIiwicXVlcnktY2xpZW50cyIsInF1ZXJ5LXVzZXJzIiwibWFuYWdlLWV2ZW50cyIsIm1hbmFnZS1yZWFsbSIsInZpZXctZXZlbnRzIiwidmlldy11c2VycyIsInZpZXctY2xpZW50cyIsIm1hbmFnZS1hdXRob3JpemF0aW9uIiwibWFuYWdlLWNsaWVudHMiLCJxdWVyeS1ncm91cHMiXX0sIm1hc3Rlci1yZWFsbSI6eyJyb2xlcyI6WyJ2aWV3LWlkZW50aXR5LXByb3ZpZGVycyIsInZpZXctcmVhbG0iLCJtYW5hZ2UtaWRlbnRpdHktcHJvdmlkZXJzIiwiaW1wZXJzb25hdGlvbiIsImNyZWF0ZS1jbGllbnQiLCJtYW5hZ2UtdXNlcnMiLCJxdWVyeS1yZWFsbXMiLCJ2aWV3LWF1dGhvcml6YXRpb24iLCJxdWVyeS1jbGllbnRzIiwicXVlcnktdXNlcnMiLCJtYW5hZ2UtZXZlbnRzIiwibWFuYWdlLXJlYWxtIiwidmlldy1ldmVudHMiLCJ2aWV3LXVzZXJzIiwidmlldy1jbGllbnRzIiwibWFuYWdlLWF1dGhvcml6YXRpb24iLCJtYW5hZ2UtY2xpZW50cyIsInF1ZXJ5LWdyb3VwcyJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19LCJhaW9wcy1yZWFsbSI6eyJyb2xlcyI6WyJ2aWV3LXJlYWxtIiwidmlldy1pZGVudGl0eS1wcm92aWRlcnMiLCJtYW5hZ2UtaWRlbnRpdHktcHJvdmlkZXJzIiwiaW1wZXJzb25hdGlvbiIsImNyZWF0ZS1jbGllbnQiLCJtYW5hZ2UtdXNlcnMiLCJxdWVyeS1yZWFsbXMiLCJ2aWV3LWF1dGhvcml6YXRpb24iLCJxdWVyeS1jbGllbnRzIiwicXVlcnktdXNlcnMiLCJtYW5hZ2UtZXZlbnRzIiwibWFuYWdlLXJlYWxtIiwidmlldy1ldmVudHMiLCJ2aWV3LXVzZXJzIiwidmlldy1jbGllbnRzIiwibWFuYWdlLWF1dGhvcml6YXRpb24iLCJtYW5hZ2UtY2xpZW50cyIsInF1ZXJ5LWdyb3VwcyJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoicm9vdCIsImxvY2FsZSI6InpoLUNOIiwiZW1haWwiOiIxMjNAcXEuY29tIn0.SQ130RR2EJG8NPjNopW3KOPBfueLowUnLHhaDlfjImHc9GqTN479GoMW_bR_doj28AezsfBD5G-qTU-U3pqawVVbjgmzMW31JF0vZtQnkCsnI7GOAJtTUM4a8teMs9eNOLR9t1CyWbSeGlIhu-kYk_O_mgxTxenfrq8H3DJ4xBuU8fKopdXoGMIcVNePujngCOYkCQBXzZceNrGXy0_7lPs7_BaDUaJ7OEVhpY8-tSKRVU7a8XOhKeSllzepiWMeEA3fhgW-A1yQz14ODEW9Dbh9axtdJ7RyhvpNH3dDa5XIIzYx8-zpn13IsbA2lWMY1WihL4I2RPyE6iEl9qSoYg",
    "expires_in": 1200,
    "refresh_expires_in": 1800,
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmNmEzMjMwNy03Y2YxLTQxNmYtOGEyYy1jMWE1NGMxZDA5NTIifQ.eyJqdGkiOiJkZTAzMjA2NC0yMjFiLTRmYTItYjgyZC03MjI3YzAzOWI0N2QiLCJleHAiOjE1ODU0OTA1NDIsIm5iZiI6MCwiaWF0IjoxNTg1NDg4NzQyLCJpc3MiOiJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F1dGgvcmVhbG1zL21hc3RlciIsInN1YiI6IjBlNmU3MGI5LTZlY2YtNGI2MC05ZTFjLWRkNWEzOTRhY2U1MyIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJhaW9wcy13ZWIiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiJkYWZkZTA2Ny00ZjFlLTQ2NjQtOTFhNC02NmIwNDZmMDZmZGIiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiY3JlYXRlLXJlYWxtIiwib2ZmbGluZV9hY2Nlc3MiLCJhZG1pbiIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsidXNlci1jZW50ZXIiOnsicm9sZXMiOlsic3VwZXJfcm9sZSJdfSwidGVzdC1yZWFsbSI6eyJyb2xlcyI6WyJ2aWV3LWlkZW50aXR5LXByb3ZpZGVycyIsInZpZXctcmVhbG0iLCJtYW5hZ2UtaWRlbnRpdHktcHJvdmlkZXJzIiwiaW1wZXJzb25hdGlvbiIsImNyZWF0ZS1jbGllbnQiLCJtYW5hZ2UtdXNlcnMiLCJxdWVyeS1yZWFsbXMiLCJ2aWV3LWF1dGhvcml6YXRpb24iLCJxdWVyeS1jbGllbnRzIiwicXVlcnktdXNlcnMiLCJtYW5hZ2UtZXZlbnRzIiwibWFuYWdlLXJlYWxtIiwidmlldy1ldmVudHMiLCJ2aWV3LXVzZXJzIiwidmlldy1jbGllbnRzIiwibWFuYWdlLWF1dGhvcml6YXRpb24iLCJtYW5hZ2UtY2xpZW50cyIsInF1ZXJ5LWdyb3VwcyJdfSwibWFzdGVyLXJlYWxtIjp7InJvbGVzIjpbInZpZXctaWRlbnRpdHktcHJvdmlkZXJzIiwidmlldy1yZWFsbSIsIm1hbmFnZS1pZGVudGl0eS1wcm92aWRlcnMiLCJpbXBlcnNvbmF0aW9uIiwiY3JlYXRlLWNsaWVudCIsIm1hbmFnZS11c2VycyIsInF1ZXJ5LXJlYWxtcyIsInZpZXctYXV0aG9yaXphdGlvbiIsInF1ZXJ5LWNsaWVudHMiLCJxdWVyeS11c2VycyIsIm1hbmFnZS1ldmVudHMiLCJtYW5hZ2UtcmVhbG0iLCJ2aWV3LWV2ZW50cyIsInZpZXctdXNlcnMiLCJ2aWV3LWNsaWVudHMiLCJtYW5hZ2UtYXV0aG9yaXphdGlvbiIsIm1hbmFnZS1jbGllbnRzIiwicXVlcnktZ3JvdXBzIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX0sImFpb3BzLXJlYWxtIjp7InJvbGVzIjpbInZpZXctcmVhbG0iLCJ2aWV3LWlkZW50aXR5LXByb3ZpZGVycyIsIm1hbmFnZS1pZGVudGl0eS1wcm92aWRlcnMiLCJpbXBlcnNvbmF0aW9uIiwiY3JlYXRlLWNsaWVudCIsIm1hbmFnZS11c2VycyIsInF1ZXJ5LXJlYWxtcyIsInZpZXctYXV0aG9yaXphdGlvbiIsInF1ZXJ5LWNsaWVudHMiLCJxdWVyeS11c2VycyIsIm1hbmFnZS1ldmVudHMiLCJtYW5hZ2UtcmVhbG0iLCJ2aWV3LWV2ZW50cyIsInZpZXctdXNlcnMiLCJ2aWV3LWNsaWVudHMiLCJtYW5hZ2UtYXV0aG9yaXphdGlvbiIsIm1hbmFnZS1jbGllbnRzIiwicXVlcnktZ3JvdXBzIl19fSwic2NvcGUiOiJlbWFpbCBwcm9maWxlIn0.uSd2u3m7AZUJmjq8OmV99ORw9JPGokGJ9S5gUDd7wVo",
    "token_type": "bearer",
    "not-before-policy": 1583228262,
    "session_state": "dafde067-4f1e-4664-91a4-66b046f06fdb",
    "scope": "email profile"
}

這里其實你需要關注的是access_tokentoken_type。當你成功獲取到token之后,你需要的是拼接token成如下形式。

Bearer {access_token}

然后將這個token放入到你請求后端接口HTTP請求的Headers的Authorization請求頭里面。
然后你就可以成功的訪問到你后端的API了。

二、使用Postman的認證工具

Keycloak的認證是基於OAuth 2.0協議的,這也就意味着獲取keycloak的token的過程是一個固定的流程。那么我們如何使用Postman訪問API呢。
首先我們先選擇authorization選項卡,然后在TYPE中選擇OAuth 2.0。
image.png
然后我們點擊橙色的按鈕Get new access token
image.png

在這個界面上,我們先選擇Grant Type為Password credentials,再依次填入Access Token URL,Username,Password,Client ID。然后就可以點擊獲取token的按鈕了。
如果獲取成功的話,應該顯示獲取到的token。然后向下滾動點擊use token,就可以訪問你需要的API了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM