Skip to content

使い方 — 既存ユーザストアの投影

既に users、members、employees、accounts などのテーブルがあり、その形が OP 同梱の oidc_users テーブルと一致しない場合でも、そのテーブルを正本として使えます。OP に必要なのは、subject を解決し、許可された claim を返し、パスワードログインを使う場合は store.UserPasswordStore の契約に沿ってパスワードハッシュを読める投影です。

ソース: examples/24-byo-userstore

構成

この例はストレージを 2 つの責務に分けます。

責務バックエンド
OAuth / OIDC レコード: clients、authorization codes、refresh tokens、grants、sessions、PAR、IAT、RAT、access tokens同梱の op/storeadapter/sql schema
エンドユーザレコード: subject、email、name、locale、パスワードハッシュ、tenant メタデータ組み込み側が所有する members テーブル

op.WithUserStore は SQL store をラップせず、/userinfo と ID トークンの claim 読み取りをアプリケーション所有の投影へ向けます。ログインフローも同じ投影をパスワード検証に使います。

go
members := &MemberUserStore{db: db}

flow := op.LoginFlow{
  Primary: op.PrimaryPassword{Store: members},
}

provider, err := op.New(
  op.WithStore(durable),
  op.WithUserStore(members),
  op.WithLoginFlow(flow),
  // required options...
)

投影の契約

通常、ユーザストアアダプタは次を実装します。

メソッド役割
FindBySubject(ctx, sub)/userinfo とトークン組み立て用に、安定した OIDC subject と claim map を読む。
FindByUsername(ctx, username)メールアドレスなどのログイン識別子を、同じ安定 subject に解決する。
ReadPasswordHash(ctx, subject)op.PrimaryPassword 用に PHC 形式のパスワードハッシュを返す。未知ユーザやパスワードレスユーザでは store.ErrNotFound を返す。

カラム名は自由です。この例では member_idemail_addresspassword_phcfull_namelocale_preftenant_idstore.User.Subjectstore.User.Claims へ投影しています。

claim の開示

store.User.Claims に値を入れても、それだけで全 RP に出るわけではありません。OP は scope と claims request によるフィルタを引き続き適用します。この例は member 行から独自の tenant claim を読みますが、それを許可する scope がないため demo RP には返りません。

アプリケーション固有 claim を scope 経由で出す場合は Public / Internal スコープ、RP が細かく claim を選ぶ場合は Claims リクエスト を参照してください。

composite が必要なケース

このパターンはエンドユーザ claim の読み取り元だけを差し替えます。トランザクションが必要な OAuth レコード群は 1 つの SQL アダプタに残るため、storeadapter/composite は不要です。WithUserStore なら adapter の任意 capability を隠してしまう wrapper も不要です。

複数のサブストアを別バックエンドに振り分けたい場合、たとえば永続化が必要な grants / refresh tokens は SQL に置き、interactions / consumed JTIs は Redis に置く場合は Hot / Cold 分離 を使います。

実行

sh
(cd examples/24-byo-userstore && go run -tags example .)

この例は OP を :8080、ペアの RP を :9090 で起動します。demo@example.test / demo でログインすると、RP の /me ページで開示された ID トークン claim を確認できます。

次に読む