Keycloakの Bearer-oncly client を使って認証の検証を行おうと思い、Express.jsとkeycloak-nodejs-connectを使った際に嵌った内容の話。
Keycloak.prototype.redirectToLogin
をオーバーライドする
これ。
https://github.com/keycloak/keycloak-nodejs-connect/blob/master/index.js#L332L334
見ての通り、Bearer-only のクライアント前提だとデフォルトではリダイレクトされる判定になっている。 Bearer-only でアクセスする場合は認証している前提なので、この条件は正しい。
しかし、Web API のようなアプリケーションの場合だとこのままではリダイレクトのレスポンスが返ってきてしまう。なので、オーバーライドして条件を修正する必要がある。テストでは以下のようになっている。
で、これはドキュメントに書いてない。正確には書いてあった。
https://github.com/keycloak/keycloak-nodejs-connect/commit/954d7a8b1fc610d9a32f72b3f98718314edc812b
Advanced Login Configuration
By default, all unauthorized requests will be redirected to the Keycloak login page unless your client is bearer-only. However, a confidential or public client may host both browsable and API endpoints. To prevent redirects on unauthenticated API requests and instead return an HTTP 401, you can override the
redirectToLogin
function.For example, this override checks if the url contains /api/ and disables login redirects:
Keycloak.prototype.redirectToLogin = function(req) { var apiReqMatcher = /\/api\//i; return !apiReqMatcher.test(req.originalUrl || req.url); };
その後、アダプタのドキュメントを移した際に README から消されたのだが、移行先のドキュメントにはこの内容は書いていない。
Keycloak サーバのドメインが自己証明書を使っているとエラーになる
これは keycloak-nodejs-connect の問題ではないし、当たり前っちゃ当たり前なんだけど、検証用でサーバ立ててる場合は注意が必要。
結論からいうと、Node(Express)のアプリ環境変数 NODE_TLS_REJECT_UNAUTHORIZED=0
を設定して起動すればよい。
これはアクセストークンの検証の処理内でエラー理由を吐いてくれてなかったので、気づくのに時間がかかった。
ので、プルリク送っておいた。