web-dev-qa-db-ja.com

KeycloakAPIは常に401を返します

REST APIを介してKeycloakとやり取りしようとしています。マスターレルムとデフォルトの管理者ユーザー、およびテストレルムがあります。まず、管理者アカウントのアクセストークンを取得し、テストレルム:

let data = {
    grant_type : 'password',
    client_id : 'test-realm',
    username : 'admin',
    password : 'admin'
};
let headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
};
axios.post(
    'https://someurl.com:8080/auth/realms/master/protocol/openid-connect/token',
    qs.stringify(data),
    headers
)

それは大丈夫です。次に、ユーザーを作成するために電話をかけようとすると(または他のことをする)、401の不正なエラーが発生します。

headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': `Bearer ${accessToken}`
};
data = {
    rep: {
        email: "[email protected]",
        username: "[email protected]"
    },
    path: 'test-realm'
};
axios.post('https://someurl.com:8080/auth/admin/realms/test-realm/users',
    qs.stringify(data),
    headers
)

それはトークンを含める正しい方法ではありませんか?アクセストークンは、他のAPI呼び出しを認証するために使用するものですか?管理者アカウントのトークンは、マスターレルムを使用して他のクライアントへの呼び出しを認証するために機能するべきではありませんか?管理コンソールで変更する必要があるのは、マスターレルムの設定でしょうか?助けていただければ幸いです。

5
Jayce444

それはトークンを含める正しい方法ではありませんか?

これは正しい方法です。

あなたはただ間違ったことをします。 keycloak-request-tokenNode.jsモジュールの例を参照してください。

https://github.com/keycloak/keycloak-request-token/blob/master/index.js#L4

あなたが使う

client_id : 'test-realm'

しかし〜がある

client_id: 'admin-cli' 

そこに(それが重要かどうかわからない)。

また、ユーザーを作成するには、

'Content-Type': 'application/json'

Keycloak REST APIのNode.jsの例については、こちらを参照してください:

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

次のような他の便利なものの例:

  • カスタムログイン
  • keycloakトークンをCookieに保存する
  • 一元化された権限ミドルウェア

同じプロジェクトで見つけることができます: keycloak-nodejs-example

5
v.ladynev

http:// localhost:808 を使用してオフライントークンを生成し、 http:// keycloak:808 を使用してAPIをリクエストしようとしたため、401エラーが発生しました=これは許可されていません。残念ながら、ログはそれを教えてくれません。

JWTトークンをデバッグするには、 https://jwt.io/ をお勧めします

1
Tobias Ernst