Bouncr日本語マニュアル
Bouncrは、オープンソースのリバースプロキシ型認証・認可ミドルウェアです。特徴としてフルAPIで認証認可+管理画面を含めて必要なものが取り揃っており、認証状態の管理もBouncrがやるので、作るバックエンドのアプリケーションを容易にステートレスにできることが挙げられます。
OpenID Connect
OpenID Connectを使って認証するには、まずIdPの設定をします。
/bouncr/api/oidc_providers
code:json
{
"name": "google",
"client_key": "Cliend ID",
"client_secret": "Client Secret",
"scope": "要求するスコープ",
"response_type": "code",
"authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
"token_endpoint": "https://www.googleapis.com/oauth2/v4/token"
}
サインインページでは、まずStateとNonceを取得します。
/bouncr/api/pre_sign_in をPOSTで呼び出すと、以下のようにstateとnonceが返ってくるので、これを「IdPでログイン」のリンクのパラメータとして付与してください。
code:json
{
"state": "uasdnvsdvbewr23",
"nonce": "4v8ntw35409tuvhusore"
}
リンク先は、Googleの場合は以下のようになります。
code:text
https://accounts.google.com/o/oauth2/v2/auth?client_id=【client_id】&response_type=code&scope=openid%20email&redirect_uri=【bouncr-apiのベースURL】/sign_in/oidc/google&state=【上記で取得したstate】&nonce=【上記で取得したnonce】
これで、GoogleのOpenID Connectのログインページに遷移し、成功すれば上で指定したredirect_uriに戻ってきます。その際、Bouncr APIが自動的にOpenIDをIdPに取得しにいき、状態に応じて以下の3つに分岐します。
1. IdPログイン成功。→ 200
2. IdPログイン処理中に何かしらの認証エラーが発生する → 401
3. IdPログイン成功したが、アカウントとの関連が無い。
1. 新規アカウント登録
2. 既存のアカウントとの関連付け
XHRでBoundrのAPIを呼び出している場合は、それぞれのケースでのリダイレクト先URLを設定できます。
signInRedirectUrl: 上記1のケース
フラグメントとQueryStringで、accountまたはtokenを受け取ることができます。デフォルトはQueryStringです。
【singInRediretUrlで設定したパス】?account=【ユーザアカウント】&token=【Bouncrの認証トークン】
unauthenticateRedirectUrl: 上記2のケース
signUpRedirectUrl: 上記3のケース
フラグメントとQueryStringで、codeを受け取ることができます。デフォルトはQueryStringです。
【singUpRediretUrlで設定したパス】?code=【サインアップ時にこのOpenID Connectと関連付けるためのコード】
3のケースでは新規アカウント登録か、既存のアカウントとの関連付けをするかはBouncr利用側アプリケーションで判別してページを出し分けてください。通常はユーザセッションが存在有無によって分岐できるはずです。
また3のケースでは、リダイレクトURLにcodeが付いてきます。これをsign_upエンドポイントに渡すことによってIdPのアカウントとBouncrアカウントの関連付けを同時に行うことができるようになります。
フロントエンド側でのエンドポイントの設定
エンドポイントはBouncrConfigurationの以下の設定で可能です。
code:java
config.getOidcConfiguration().setSignUpRedirectUrl(URI.create("http://localhost:8000/#/sign_up"));
config.getOidcConfiguration().setSignInRedirectUrl(URI.create("http://localhost:8000/#/sign_in_by_oidc"));
config.getOidcConfiguration().setUnauthenticateRedirectUrl(URI.create("http://localhost:8000/#/sign_in_failure"));
OpenID Connect経由のサインアップ
OpenId Connectのプロバイダから取得したClaim(Email等が含まれる)を、サインアップ時にinvitationのエンドポイントで参照できます。例えば、これを用いてユーザプロフィールのデフォルト入力に使います。
code:shell
% curl -i -XGET -H 'content-type: application/json' -H 'accept: application/json' -H "X-Bouncr-Credential: ${BOUNCR_CREDENTIAL}" "http://localhost:3005/bouncr/api/invitation/${code}"
{
"oidc_invitations":[
{
"oidc_provider": "google",
"claim": {
"email": "xxxxxx@gmai.com"
}
]}
ユーザが接続しているOpenId Connectプロバイダの情報をみる
ユーザプロフィールのページなどで、どのOpenId Connectプロバイダと繋げているか(そのプロバイダ経由でサインイン/サインアップしたことがあるか)は、userのエンドポイントでembedパラメータにoidc_providersを付けることで取得できます。
code:shell
http://localhost:3000/bouncr/api/user/user1?embed=(oidc_providers)
{
"account": "user1",
"email": "user1@example.com",
"oidc_providers": "google"
}