OpenID Connect (OIDC) は
OAuth 2.0 を使用する認証プロトコルであり、OAuth 2.0 のオーソライズプロセスの拡張として認証を実装します。この拡張機能を使用するには、アプリケーションの管理者が認証タイプの設定時に適用範囲 openid をオーソライズの要求に含める必要があります。実行された認証に関する情報は、ID Token と呼ばれる JSON Web Token (JWT) で返されます。
次に注意してください:
- OIDC を実装する OAuth 2.0 認証サーバーのことを OpenID Provider (OP) と呼びます。
- OIDC を使用する OAuth 2.0 クライアントアプリケーションのことを Relying Party (RP) と呼びます。
OIDC は OAuth 2.0 を使用するため、GAM の現在の実装では、OAuth 2.0 の ID プロバイダーに対してアプリケーションの認証が可能です。また、適用範囲 openid を追加することで、OP に対するアプリケーションの認証が可能になります。
OIDC の設定には OAuth 2.0 の設定が必要です。OAuth 2.0 の設定については、
GAM の認証タイプ: OAuth 2.0 のドキュメントを参照してください。
また、OpenID Connect の ID Token の検証機能を使用するには、
GeneXusJWT モジュールと
GeneXusAPICommon モジュールをインストールする必要があります。
ここには次の項目があります:
- [ Enable OpenID Connect Protocol? ] : このオプションを有効にすると、OpenID Connect プロトコルの使用を GAM に指定することになります。この場合、適用範囲 openid が自動的に追加されるため、設定担当の開発者が追加する必要はありません。また、OpenID Connect のセクションが表示されます。ここには次の項目があります。
- [ Validate ID Token? ] : このオプションを有効にすると、受け取る ID Token の検証を GAM に指定することになります (発行元 URL、トークン署名、クレームなど)。トークンの検証に必要な次の 2 つの項目も表示されます。
- [ Issuer URL ] : ID Token 発行元の URL を追加する必要があります。
- [ Path to server certificate filename ] : トークンの署名に使用された秘密鍵に対応する発行元の証明書へのパスを指定する必要があります。
- [ Allow only users with verified email? ] : このオプションを有効にすると、メールアドレスを確認済みのユーザーにのみアプリケーションへのアクセスが許可されます。
ディスカバリー URL: GeneXus が証明書をディレクトリーに保存するにはアクセス許可が必要となるため、ユーザーが変更しなくても証明書を自動的に更新するプロシージャーを維持する必要があります。証明書の更新間隔は、プロバイダーによって 15 日から 3 か月までさまざまです。
最初に、Google Web アプリケーションを作成し、対応するコールバック URL が設定されている必要があります。例: https://gamidentityprovider.com/ServerNetSQL/oauth/gam/callback (URL https://gamidentityprovider.com/ServerNetSQL はナレッジベースに関連付けられています)。次に、GAM Backend で、次に示すように、OAuth 2.0 プロトコルを使用する新しい認証タイプを追加します:
OAuth 2.0 と OIDC の拡張機能を使用する場合のために GAM に用意されている各タブの設定を以下に示します:
ID Token を検証するオプションを選択した場合、UserInfo エンドポイントデータのリクエストは不要です。このフィールドは空のままで構いません。ID Token を検証してから UserInfo エンドポイントを呼び出す場合は、エンドポイントから取得されたデータが優先されます。
ID プロバイダーに OAuth 2.0 プロトコルがあること、また OpenID Connect を実装することが必要です。また、認証されたユーザーのデータを取得するためのサービスが必要です。
カスタムのコールバック URL を設定する場合は、OP からの応答を処理するプロシージャーを作成する必要があります。この場合について以下に説明します。
認証タイプにカスタムのコールバック URL を設定する場合の実装方法として、OP の応答を処理する次の行を含むプロシージャーを作成できます:
&Response = &HTTPRequest.QueryString
GAMRepository.InputExternalAuthentication(&Response)
また、URLRewrite タイプのオブジェクトを作成し、次の行を含めることも必要です:
callback => NombreProcCallback;
これにより、フレンドリー URL を定義し、サイトの使いやすさ、アクセスしやすさを高めることができます。コールバックのフレンドリー URL は指定 URL と一致している必要があります (たとえば、GAM で設定するコールバック URL が https://www.example.com/dirCallback で、OP の応答を処理するプロシージャーが
CallbackIDPCustom の場合、URLRewrite で「dirCallback => CallbackIDPCustom;」を追加します)。
開発者は、GAM DB に記録されるユーザーデータを完全に制御できるイベントサブスクリプションを定義できます。イベント「Repository - External Authentication Response」の例を以下に示します。以前は、GAM のイベントサブスクリプションのセクションでこのイベントをサブスクライブし、イベントのトリガー時にクエリを処理するプロシージャーを関連付ける必要がありました:
プロシージャーの [ Rules ] エレメントでは次のようにします:
Parm(in:&EventName, in:&JsonIIn the Source section of the procedure:N, out:&JsonOUT);
プロシージャーの [ Source ] エレメントでは次のようにします:
/*
El JSON de entrada, &JsonIN, tendrá la siguiente forma:
{"GAMToken":"efe29cd2-d45...",
"AuthenticationTypeId":"Oauth20",
"AutenticationTypeName":"google_oidc",
"MethodName":"gettoken" or "getuserinfo" or "getrefreshtoken" ,
"String":"{\"access_token\":\"27ef...y2\",
\"refresh_token\":\"09e5...u6\",
\"token_type\":\"bearer\",
\"expires_in\":3600,
\"id_token\":\"eyJ...8h\"}
"}
*/
&GAMExternalAuthenticationResponse.FromJsonString(&JsonIN)
If &GAMExternalAuthenticationResponse.AutenticationTypeName = !"google_oidc" AND
&GAMExternalAuthenticationResponse.MethodName = !"getuserinfo"
&JsonString = &GAMExternalAuthenticationResponse.String
&JsonString.ReplaceRegEx('\"','"') //ユーザーは JSON のパースが必要
&SDT_IDUruguayUser.FromJson(&JsonString)
&GAMUser.Load(GAMUser.GetId())
If &GAMUser.Success()
&GAMUser.FirstName = Format("%1 %2",&SDT_GoogleUser.first_name.Trim(), &SDT_GoogleUser.middle_name.Trim() )
&GAMUser.LastName = Format("%1 %2",&SDT_GoogleUser.last_name.Trim(), &SDT_GoogleUser.second_surname.Trim() )
&GAMUser.Save()
If &GAMUser.Success()
commit
Endif
Endif
Endif
ユーザーが
google_oidc 認証を使って登録されるとき、このプロシージャーにより、氏名の両方を入力して認証済みユーザーを GAM DB に登録できます。データを必要に応じて処理し、
google_oidc で認証されたユーザーを最適な方法で保存できます。