最近のアクセス:
GAM - ワン タイム パスワード (OTP)

認証のたびに一時的なパスワードを生成し、ログインフォームで指定したユーザーに E メールまたは SMS で送信する機能です。これはワン タイム パスワード (OTP) と呼ばれています。
OTP はアプリケーションで容易に認証を行えるようにするためのものです。ユーザーは特定のパスワードを使用せずにログインできるため、パスワードを憶えたり、パスワードマネージャを使用したりする必要がありません。
OTP の目的は、パスワードを設定して記憶する煩わしさを省くことです。ログインプロセスごとに、ランダムなパスワードでユーザーを認証できます。ユーザーは、ログインに使用すると名前とメールアドレスを憶えておくだけでアプリケーションに安全にアクセスできます。

仕組み

Web アプリケーションでユーザーを認証するときに、パスワードが生成され、E メールまたは SMS で送信されます。既定では、GAM は E メールでパスワードを送信します。ユーザーへのコードの送信方法はカスタマイズが可能です。たとえば、SMS でパスワードを送信することができます。
手順はモバイルアプリケーションの場合も同じです。
自己生成されたパスワードは、期限内に一度だけログインに使用できます。セキュリティ上の理由から、OTP には有効期限が必要です。有効期限はアプリケーション管理者が設定できます。

OTP を使用する場合の GAM の要件

OTP を使用するには、そのユーザーが GeneXus Access Manager (GAM) に存在している必要があります。ユーザーが事前に登録されていること、また、OTP を受け取る手段 (E メールまたは SMS) の信頼性 (実際に登録されているユーザーであること) が検証済みであることが必要です。つまり、OTP を介して新規ユーザーを作成することはできません。
OTP を使ってログインするユーザーは、別の認証タイプで GAM に既存するユーザーを偽装します。

OTP の設定手順

ワン タイム パスワードは認証タイプであるため、実装するには、別の認証タイプとして追加する必要があります。
OTP 実装の最小要件の例を次に示します。

OTP 認証タイプの追加

  • 手順 1 - GAM メニューで、 [ Settings ] > [ authentication types ] を選択します。
 
イメージ:52333.jpg
  • 手順 2 - [ ADD ] ボタンをクリックします。
イメージ:52332.jpg
 
  • 手順 3 - コンボボックスで [ One Time Password ] を選択します。選択するとフォームが表示されます。
イメージ:52334.jpg
 
  • 手順 4 - 表示されたフォームで、名前を入力し、 [ Enabled? ] チェックボックスを選択し、 [ Use For First Factor Authentication ] チェックボックス (画像の #2) を選択します。
イメージ:52335.jpg
 

OTP のプロパティ

次の表で、OTP のプロパティについて説明します。プロパティの前についている数字は、上の画像に示されている数字に対応しています。
プロパティ
説明
1- Impersonate
OTP を使用する場合にユーザーを検証する認証タイプです。対象となるユーザーは既に存在する必要があります。
2- UseForFirstFactorAuthentication
このログインメソッドを 1 つ目の要素認証として使用するかどうかを設定します。このプロパティを設定しない場合、OTP は 2 つ目の要素としてのみ使用できます。
3- EventValidUser
GAMEvents.User_OneTimePasswordValidateUser
OTP を要求したユーザーに使用を許可するかどうかを検証するための、開発者イベントです。
4- AutogeneratedCodeLength
自動生成されるキーの長さです (3 ~ 32)。
既定値 = 6。
5- GenerateCodeOnlyNumbers
数値のみの自動生成キーです。
既定値 = True。
6- CodeExpirationTimeout
OTP キーの有効期間です (秒単位)。
既定値 = 1800。
最小値 = 10。
7- MaximumDailyNumberCodes
1 日あたりの OTP の最大数です。
0 = 無制限。
既定値 = 12。
8- NumberUnsuccessfulRetriesToLockOTP
ユーザーへの OTP の送信をロックするまでの、再試行失敗の数です。
0 = 設定しない。
既定値 = 3。
9- NumberUnsuccessfulRetriesToBlockUserBasedOfOTPLocks  
ユーザーをブロックするまでの、再試行失敗の数です。
10- AutoUnlockTime
GAMUser.UnblockOTPCodes(&Errors)
ユーザーの OTP をロック解除するまでの時間です (分単位)。
既定値 = 60。
値を 0 に設定した場合、管理者がユーザーのロックを解除するまで、そのユーザーはロックされたままになります。
11- EventSendCode
GAMEvents.User_OneTimePasswordSendCode
OTP キーを送信するための開発者イベントです。
値を空にすると、GAM は OTP を E メールで送信します。
12- Empty property EventSendCode
値を空にすると、GAM は OTP を E メールで送信します。また、 [ GAM - E メール ] オプションが表示され、「GAMEvents.User_OneTimePasswordSendCode」GAM イベントが含まれるコンボボックスがリストされます。
13- MailMessageSubject
(EventSendCode が空の場合のみ)
ユーザーが受け取る E メールの件名です。件名の「%1」にはアプリケーション名が入ります。
14- MailMessageBodyHTML
(EventSendCode が空の場合のみ)
ユーザーに送信するメッセージ (HTML コードを許可) です。
「%1」が含まれる場合、そこにアプリケーションの名前が入ります。
「%2」には OTPCode が配置されます。
「%1」とだけ記述すると、OTPCode のみが送信されます。
「%1」も「%2」も記述しない場合、OTPCode はメッセージの最後に配置されます。
15- EventValidateCode
GAMEvents.User_OneTimePasswordValidateCode
OTPCode を検証するための開発者イベントです。
コンボボックスの最初のオプションは GAM で、その後に GAMEvents.User_OneTimePasswordValidateCode タイプの GAM イベントのリストが続きます。
何も設定しないと、GAM はデータベーステーブルに格納されているキーを使用して OTP を検証します。
プロシージャーが選択されている場合は、GAM イベントが実行されます。

カスタム ワン タイム パスワード

OTP 動作の一部のイベントをカスタマイズできます。すべてのイベントをカスタマイズする必要はありません。4 つのイベントの動作のうち 1 つを変更する必要がある場合は、1 つだけ変更できます。イベントには次のものがあります: 
  • ユーザーの検証。上記の表の 3 番です。
  • コードの生成。
  • コードの送信。上記の表の 11 番です。
  • コードの検証。上記の表の 15 番です。
これらのイベントを実装するには、GAM バックエンドでそれらをサブスクライブする必要があります。

カスタム OTP の実装方法

  • 手順 1: OTP のカスタムアクションに関連付ける各イベントをサブスクライブします。
次に示す画像は、GAM イベントサブスクリプションの例です。
イメージ:52336.jpg
  • 手順 2: 認証タイプとしてワン タイム パスワードを追加し、 [ Code generation type ] に [ OTP custom ] を選択します。
次に示す画像の 1 番です。
イメージ:52337.jpg
  • 手順 3: カスタマイズするイベントを選択します。この画像では、2、3、4、5 番が、カスタマイズ可能なイベント項目です。
見て分かるように、これらに設定した内容は、手順 1 で追加したイベントの名前になっています。

イベントのデータ

ここでは、サブスクライブできる GAM イベントについて説明します。
各イベントの受け取りオブジェクトは GAMOTPEventSubscription です。
  • 受け取ったイベント
GAMOTPEventSubscription:
{
    "ApplicationId": 2
    "UserGUID": "3f471dce-cbcc-4467-a269-77f39a4132d7"    
    "OTPCode" : ""
}
  • イベントが成功した場合
GAMOTPEventSubscription:
{
    "ApplicationId": 2
    "UserGUID": "3f471dce-cbcc-4467-a269-77f39a4132d7"    
    "OTPCode" : "123456"
}
  • イベントが成功しなかった場合
GAMError:
{
    "Code": 440,
    "Message": "OTP custom event error when generating code"
}
 

GAMEvents.User_OneTimePasswordValidateUser

GeneXus 開発者がこのアクションをカスタマイズするプロシージャーをビルドする場合、イベントプロシージャーに次が含まれている必要があります: Parm(in:&EventName, in:&JsonIN, out:&JsonOUT);
このイベントは、&JsonIN に、ApplicationID と UserGUID を含む GAMOTPEventSubscription オブジェクトから JSON を取得します。エラーが発生した場合は、GAMError 形式のオブジェクトを含む JSON を &JsonOUT から取得する必要があります。
応答が正しい場合、&JsonOUT は何も取得しません。

GAMEvents.User_OneTimePasswordGenerateCode

GeneXus 開発者がパスワード生成プロセスをカスタマイズするプロシージャーをビルドする場合、イベントプロシージャーには次が含まれます: Parm(in:&EventName, in:&JsonIN, out:&JsonOUT);。
このイベントは、ApplicationID および UserGUID を含む GAMOTPEventSubscription オブジェクトの JSON を含む &JsonIN を受け取ります。
エラーが発生した場合、&JsonOUT は GAMError 形式の JSON を取得します。エラーが発生しなかった場合、&JsonOUT は、GAMOTPEventSubscription オブジェクトの 3 つの項目属性と OTPCode フィールドのデータを持つ JSON を取得します。

GAMEvents.User_OneTimePasswordSendCode

このイベントでは、OTPCode をユーザーに送信する方法 (SMS、E メールなど) のみをカスタマイズできます。
GAM Email send を設定する場合は、E メールサーバーが必要です。この設定は、 [ Repository Configuration ] > [ Emails ] で行うことができます。
GeneXus 開発者がこのアクションをカスタマイズするプロシージャーをビルドする場合、イベントプロシージャーには Parm(in:&EventName, in:&JsonIN, out:&JsonOUT) が含まれている必要があります。このイベントは、ApplicationID、UserGUID、および OTPCode を含む GAMOTPEventSubscription オブジェクトから &JsonIN に JSON を取得します。エラーが発生した場合は、GAMError 形式オブジェクトの JSON を &JsonOUT から取得する必要があります。
応答が正しい場合、&JsonOUT は何も取得しません。

GAMEvents.User_OneTimePasswordValidateCode

何も設定しないと、GAM はデータベーステーブルに格納されているキーを使用して OTP を検証します。
GeneXus ユーザー開発者が何らかのカスタマイズを行うためのプロシージャーを開発する場合、選択したイベントが実行されると、そのプロシージャーも実行されます。
GeneXus 開発者がこのアクションをカスタマイズするプロシージャーをビルドする場合、イベントプロシージャーには Parm(in:&EventName, in:&JsonIN, out:&JsonOUT) が含まれている必要があります。このイベントは、ApplicationID、UserGUID、および OTPCode を含む GAMOTPEventSubscription オブジェクトから &JsonIN に JSON を取得します。エラーが発生した場合は、GAMError 形式オブジェクトの JSON を &JsonOUT から取得します。エラーが発生しなかった場合は、何も取得されません。
このイベントでは、開発者による OTPCode 検証のカスタマイズのみが可能です。この検証が正しく実行されると、GAM でも検証されます。

カスタム OTP イベントの例

次に示すのは、コードの検証中にカスタム OTP をトリガーするように設定されたプロシージャーの例です。
    Case &EventName = GAMEvents.User_OneTimePasswordValidateCode
        &GAMOTPEventSubscription.FromJsonString(&JsonIN)
        Msg("TRACE-GAMEventTest - User_OneTimePasswordValidateCode - &GAMOTPEventSubscription:" + &GAMOTPEventSubscription.ToJsonString()   ,status)

        &GAMUser.Load(&GAMOTPEventSubscription.UserGUID)
        If &GAMUser.Success()
            If &GAMUser.EMail.Trim() = !"user@example.com"  
                If not &GAMOTPEventSubscription.OTPCode.IsEmpty()
                    If &GAMOTPEventSubscription.OTPCode    = "123456"
                        //検証成功
                        Msg("TRACE-GAMEventTest - User_OneTimePasswordValidateCode - OK1:" + &GAMOTPEventSubscription.OTPCode + "  Email:" + &GAMUser.EMail   ,status)
                    Else
                        &GAMError.Code        = GAMErrorMessages.UserInactive
                        &GAMError.Message    = "the code is not valid. try again.  THIS IS A CUSTOM MESSAGE :)"
                        &JsonOUT = &GAMError.ToJsonString()
                    Endif
                Else
                    &GAMError.Code        = GAMErrorMessages.UserInactive
                    &GAMError.Message    = "Error validating code. could not get the code."
                    &JsonOUT = &GAMError.ToJsonString()
                Endif
            Else
                //コード検証成功
                Msg("TRACE-GAMEventTest - User_OneTimePasswordValidateCode - OK2:" + &GAMOTPEventSubscription.OTPCode + "  Email:" + &GAMUser.EMail   ,status)
            Endif
        Else
            &GAMError.Code        = GAMErrorMessages.UserInactive
            &GAMError.Message    = "User does not exists, verify user name."
            &JsonOUT = &GAMError.ToJsonString()
        Endif
    
EndCase

ユーザーのブロック解除メソッド

GAMUser.UnblockOTPCodes(&Errors)

このメソッドは、OTP ブロックの数、失敗した OTP 再試行の数、および 1 日あたりの OTP の数をリセットします。

E メールサーバーの設定

SMTP サーバーを Google で設定する方法を参照できます。次に示す例の設定の多くは、Google SMTP サーバーをベースにしています。
  • 手順 1 - 新しい E メールサーバーを追加するには、 [ Settings ] > [ Repository Configuration ] > [ EMails ] に移動します。
  • 手順 2 - E メールサーバーの設定には次のプロパティが必要です。
    • Server Host
    • Server Port
    • Secure 
    • Server requires authentication 
    • User name
    • Password
イメージ:52338.jpg
 

アプリケーション名

アプリケーションの名前は、 [ Settings ] > [ Repository Configuration ] で設定します
名前を入力するフォームが表示されます。これがアプリケーションの名前になります。
イメージ:52339.jpg

Web アプリケーション

次のコードは、Web アプリケーションのログインで OTP を実装する方法を示しています。
Event 'GAM-OneTimePassword'
    &AdditionalParameter.AuthenticationTypeName = !"gam-otp-web"
    &AdditionalParameter.OTPStep                = 1
    &LoginOK = GAMRepository.Login(&UserName, &UserPassword_nula, &AdditionalParameter, &Errors )
    If &LoginOK
        &URL = GAMRepository.GetLastErrorsURL()
        If &URL.IsEmpty()
            GAMHome()
        Else
            Link(&URL)
        Endif
    Else
        If &Errors.Count > 0 
            If (&Errors.Item(1).Code = GAMErrorMessages.UserAccessCodeSent)  //エラー 400
                &UserName.Enable      = False
                &UserOTP.Enable       = True
                Login.Caption         = "Send Access Code"
            Endif
        Endif
    Endif
Endevent
OTP 認証が必要な場合、WebPanel のコードは次のようになります。
Event 'GAM-OneTimePassword-Step2'
    &AdditionalParameter.AuthenticationTypeName = !"gam-otp-web"
    &AdditionalParameter.OTPStep                = 2
    &LoginOK = GAMRepository.Login(&UserName, &User_OTP, &AdditionalParameter, &Errors )
Endevent

ネイティブモバイル

次のコードは、ネイティブ モバイル アプリケーションのログインで OTP を実装する方法を示しています。
Event 'GAM-OneTimePassword-Step1'
    Composite
        &LoginExternalAdditionalParameters.AuthenticationTypeName = !"gam-otp-sd"
        &LoginExternalAdditionalParameters.OTPStep                = 1
        GeneXus.SD.Actions.LoginExternal(GAMAuthenticationTypes.GAMOTP, &UserName, &Password_nula, &LoginExternalAdditionalParameters)
    EndComposite
Endevent
 

使用可能バージョン

GeneXus 17 Upgrade 5 以降。

参考情報

GAM - モバイル用ワンタイムパスワード
 

サブページ
Created: 22/03/14 00:49 by Admin Last update: 23/05/24 03:21 by Admin
カテゴリ
Powered by GXwiki 3.0