2024年2月2日金曜日

OpenID Providerを作る)login_hintを使ってログインユーザを指定する

こんにちは、富士榮です。

徐々にユーザ認証の実装に向けてすすめていきます。

が、ログイン画面を作るのが面倒くさいのでlogin_hint属性を使ってログイン対象となるユーザを指定するところからスタートしてみます。(完全に暫定対応です)


その前にこれまでのおさらいです。


login_hintとは

本来のlogin_hintを含むhint系の属性の使い方はOpenID Providerの前段で何らかの処理を行った結果をOpenID Providerに伝えるために使われるパラメータです。
例えば、id_token_hintは以前RPに対して発行したid_tokenを引き継いで追加で認証や属性の送出を行う場合など(典型的な例だと、Entra IDにおける多要素認証の強制)に用いられます。
今回のlogin_hintは仕様を見るとこのように記載されています。
OPTIONAL. Authorization Server に対する End-User ログイン識別子のヒントとして利用される. RP が End-User に Email アドレス (もしくはその他の識別子) を要求し, それを Authorization Server にヒントとして送信することでヒントとする. Discovery に利用された値をヒントの値として利用することを推奨する (RECOMMENDED). この値は phone_number Claim に指定されるフォーマットに従った電話番号でもよい (MAY). このパラメータを利用するか否かは OP の判断にゆだねる.
要するにRPからOPへログインさせるユーザに関するヒントを提供する、というためのパラメータですね。
今回はヒントと言いつつこの属性をそのままユーザ識別子として利用してしまいたいと思います。

login_hintの指定方法

単純に認証リクエストにクエリパラメータとしてlogin_hint=xxxという形で指定するだけです。
例)
localhost:3000/oauth2/authorize?scope=openid address phone&response_type=id_token&client_id=123&redirect_uri=https://jwt.ms&state=hoge&login_hint=test@example.jp
内部処理も単純にクエリパラメータを取得するだけですし、今回のケースだとそのままユーザストアを検索するためのキーとして利用します。

login_hintの取得
// login_hint属性からユーザ情報を取得する
const login_hint = req.query.login_hint;

ユーザ情報の取得
// ユーザ名を指定して属性情報を取得する
// login_hintを使う
let payload = await userIdentity.getUserIdentityByLoginId(login_hint, scopes);


これでユーザ情報を取得し、id_tokenを発行できました。


今回はここまでです。
そろそろ真面目に認証画面を作ろうかと思いつつ面倒臭さが勝っている今日この頃です。

0 件のコメント: