2017-03-08 30 views
2

我有一個angular2客戶端連接到由Play Framework實現的web api。客戶端被重定向到keycloak服務器以獲取令牌。我在他們的github項目中跟蹤了Keycloak樣本,客戶端正在工作並獲得令牌。不幸的是,我找不到適用於Play Framework的適配器。到目前爲止,我有以下代碼來檢查用戶是否有權訪問請求的資源。Keycloak資源沒有適配器的授權

val authzClient = AuthzClient.create() 

    val request = new EntitlementRequest 
    val permissions = new PermissionRequest 
    permissions.setResourceSetName(resourceName) 
    request.addPermission(permissions) 

    val entitlementResponse = authzClient.entitlement(token) 
    .get(resourceServer, request) 

我假設服務器是否返回禁止的代碼,令牌用戶無權訪問資源。我在正確的軌道上嗎?謝謝。

更新:

我開發了一個自定義操作,檢查頭和驗證授權托克:

import pdi.jwt.{JwtAlgorithm, JwtJson} 
import play.api.libs.json.{JsValue, Json} 
import play.api.mvc.{ActionRefiner, Request, Result, Results} 

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 
import scala.util.{Failure, Success} 

case class UserRequest[A](user: User, request: Request[A]) 

object UserAction extends ActionRefiner[Request, UserRequest] { 

    private val secret = "xxxxxx" 
    private val algorithm = JwtAlgorithm.RS256 

    override protected def refine[A](request: Request[A]): Future[Either[Result, UserRequest[A]]] = Future { 
    request.headers.get("Authorization") match { 
     case Some(headerToken) => { 
     val token = headerToken.substring(7) 

     JwtJson.decode(token, secret, Seq(algorithm)) match { 
      case Success(validToken) => { 
      val tokenJson = Json.parse(validToken.content) 
      val user = extractUser(tokenJson) 
      Right(UserRequest(user, request)) 
      } 
      case Failure(ex) => 
      Left(Results.Unauthorized) 
     } 
     } 
     case None => Left(Results.Unauthorized) 
    } 
    } 

    private def extractUser(token: JsValue): User = { 
    val username = (token \ "preferred_username").as[String] 
    val firstName = (token \ "given_name").asOpt[String] 
    val familyName = (token \ "family_name").asOpt[String] 
    val name = (token \ "name").asOpt[String] 

    User(username, firstName, familyName, name) 
    } 
} 
+0

您是否找到了缺少Play Framework適配器的解決方案? – Atropo

+0

我最終使用jwt-play來驗證播放服務器端的令牌。如果有幫助,我可以發佈代碼。 –

+0

是的,這將是有益的,謝謝! – Atropo

回答

0

是。我已經使用授權API和範圍實施了具有此類檢查的測試keycloak-nodejs-example項目。如果用戶未通過檢查權限,Keycloak將返回HTTP code 403 FORBIDDEN

https://github.com/v-ladynev/keycloak-nodejs-example/blob/master/app.js

反正Keycloak應返回GET或PUT請求成功的HTTP代碼,如果用戶有權限。 你可以只檢查它使用curl

http://www.keycloak.org/docs/2.3/authorization_services_guide/topics/service/entitlement/entitlement-api-aapi.html

您使用的資源名稱。資源有URI。直接檢查URI將會很有趣。但我仍然不知道如何。

您應該始終爲Keycloak的每個請求提供access_token。有時,您可以使用admin憑證從Keycloak獲取此令牌,使用此URl:auth/realms/master/protocol/openid-connect/tokenmaster是預定義領域的名稱)。

但是對於授權API,您需要一個當前用戶令牌,因爲Keycloak應該瞭解女巫用戶評估權限。

您可以使用https://jwt.io/解碼RPT令牌。這只是具有權限的JSON。如果您執行GET權利請求,您將擁有所有權限。對於POST請求,您將只評估權限或FORBIDDEN 403

+0

在我的情況下,客戶端是anuglar2應用程序。這意味着對於我的Scala服務器上的anuglar2的每個請求,我必須從頭文件中提取令牌並將其發送到keycloak以獲取特定資源的用戶權限? –

+0

同時,授權api返回和rpt令牌。這個令牌有什麼用途?在上面的代碼中,我使用從angular2應用程序發送的不記名令牌。 –

+0

@MeisamEmamjome我已經更新了我的答案。我不知道使用此代碼'authzClient.entitlement(token).get(resourceServer,request)'執行哪個請求。您是否檢查過「FORBIDDEN」回覆? –