こんにちは、富士榮です。
徐々にユーザ認証の実装に向けてすすめていきます。
が、ログイン画面を作るのが面倒くさいのでlogin_hint属性を使ってログイン対象となるユーザを指定するところからスタートしてみます。(完全に暫定対応です)
その前にこれまでのおさらいです。
- まずは全体像から
- まずOpenID Providerの情報をRelying Partyに提供する
- OpenID Providerを作る)認可エンドポイントを作る
- OpenID Providerを作る)トークンエンドポイントを作る
- OpenID Providerを作る)UserInfoエンドポイントを作る
- OpenID Providerを作る)response_typeを実装する
- OpenID Providerを作る)Hybridフローを実装する
- OpenID Providerを作る)Pairwise識別子を実装する
- OpenID Providerを作る)scopeの定義と返却する属性
- OpenID Providerを作る)定義済み属性の値として何を返却すべきか
- OpenID Providerを作る)トークンエンドポイントにクライアント認証を実装する
- OpenID Providerを作る)認可エンドポイントでクライアントの登録状態を検証する
- OpenID Providerを作る)ユーザ情報をデータベースから取得する
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 件のコメント:
コメントを投稿