認証のたびに一時的なパスワードを生成し、ログインフォームで指定したユーザーに E メールまたは SMS で送信する機能です。これは
ワン タイム パスワード (OTP) と呼ばれています。
OTP はアプリケーションで容易に認証を行えるようにするためのものです。ユーザーは特定のパスワードを使用せずにログインできるため、パスワードを憶えたり、パスワードマネージャを使用したりする必要がありません。
OTP の目的は、パスワードを設定して記憶する煩わしさを省くことです。ログインプロセスごとに、ランダムなパスワードでユーザーを認証できます。ユーザーは、ログインに使用すると名前とメールアドレスを憶えておくだけでアプリケーションに安全にアクセスできます。
Web アプリケーションでユーザーを認証するときに、パスワードが生成され、E メールまたは SMS で送信されます。既定では、GAM は E メールでパスワードを送信します。ユーザーへのコードの送信方法はカスタマイズが可能です。たとえば、SMS でパスワードを送信することができます。
手順はモバイルアプリケーションの場合も同じです。
自己生成されたパスワードは、期限内に一度だけログインに使用できます。セキュリティ上の理由から、OTP には有効期限が必要です。有効期限はアプリケーション管理者が設定できます。
OTP を使用するには、そのユーザーが
GeneXus Access Manager (GAM) に存在している必要があります。ユーザーが事前に登録されていること、また、OTP を受け取る手段 (E メールまたは SMS) の信頼性 (実際に登録されているユーザーであること) が検証済みであることが必要です。つまり、OTP を介して新規ユーザーを作成することはできません。
OTP を使ってログインするユーザーは、別の認証タイプで GAM に既存するユーザーを
偽装します。
ワン タイム パスワードは認証タイプであるため、実装するには、別の
認証タイプとして追加する必要があります。
OTP 実装の最小要件の例を次に示します。
- 手順 1 - GAM メニューで、 [ Settings ] > [ authentication types ] を選択します。
- 手順 2 - [ ADD ] ボタンをクリックします。
- 手順 3 - コンボボックスで [ One Time Password ] を選択します。選択するとフォームが表示されます。
- 手順 4 - 表示されたフォームで、名前を入力し、 [ Enabled? ] チェックボックスを選択し、 [ Use For First Factor Authentication ] チェックボックス (画像の #2) を選択します。
次の表で、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 バックエンドでそれらをサブスクライブする必要があります。
- 手順 1: OTP のカスタムアクションに関連付ける各イベントをサブスクライブします。
次に示す画像は、GAM イベントサブスクリプションの例です。
- 手順 2: 認証タイプとしてワン タイム パスワードを追加し、 [ Code generation type ] に [ OTP custom ] を選択します。
次に示す画像の 1 番です。
- 手順 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"
}
GeneXus 開発者がこのアクションをカスタマイズするプロシージャーをビルドする場合、イベントプロシージャーに次が含まれている必要があります: Parm(in:&EventName, in:&JsonIN, out:&JsonOUT);
このイベントは、&JsonIN に、ApplicationID と UserGUID を含む GAMOTPEventSubscription オブジェクトから JSON を取得します。エラーが発生した場合は、GAMError 形式のオブジェクトを含む JSON を &JsonOUT から取得する必要があります。
応答が正しい場合、&JsonOUT は何も取得しません。
GeneXus 開発者がパスワード生成プロセスをカスタマイズするプロシージャーをビルドする場合、イベントプロシージャーには次が含まれます:
Parm(in:&EventName, in:&JsonIN, out:&JsonOUT);。
このイベントは、ApplicationID および UserGUID を含む
GAMOTPEventSubscription オブジェクトの JSON を含む &JsonIN を受け取ります。
エラーが発生した場合、&JsonOUT は GAMError 形式の JSON を取得します。エラーが発生しなかった場合、&JsonOUT は、GAMOTPEventSubscription オブジェクトの 3 つの項目属性と OTPCode フィールドのデータを持つ JSON を取得します。
このイベントでは、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 は何も取得しません。
何も設定しないと、GAM はデータベーステーブルに格納されているキーを使用して OTP を検証します。
GeneXus ユーザー開発者が何らかのカスタマイズを行うためのプロシージャーを開発する場合、選択したイベントが実行されると、そのプロシージャーも実行されます。
GeneXus 開発者がこのアクションをカスタマイズするプロシージャーをビルドする場合、イベントプロシージャーには Parm(in:&EventName, in:&JsonIN, out:&JsonOUT) が含まれている必要があります。このイベントは、ApplicationID、UserGUID、および OTPCode を含む GAMOTPEventSubscription オブジェクトから &JsonIN に JSON を取得します。エラーが発生した場合は、GAMError 形式オブジェクトの JSON を &JsonOUT から取得します。エラーが発生しなかった場合は、何も取得されません。
このイベントでは、開発者による OTPCode 検証のカスタマイズのみが可能です。この検証が正しく実行されると、GAM でも検証されます。
次に示すのは、コードの検証中にカスタム 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
このメソッドは、OTP ブロックの数、失敗した OTP 再試行の数、および 1 日あたりの OTP の数をリセットします。
SMTP サーバーを Google で設定する方法を参照できます。次に示す例の設定の多くは、Google SMTP サーバーをベースにしています。
- 手順 1 - 新しい E メールサーバーを追加するには、 [ Settings ] > [ Repository Configuration ] > [ EMails ] に移動します。
- 手順 2 - E メールサーバーの設定には次のプロパティが必要です。
-
Server Host
-
Server Port
-
Secure
-
Server requires authentication
-
User name
-
Password
アプリケーションの名前は、 [ Settings ] > [ Repository Configuration ] で設定します
。
名前を入力するフォームが表示されます。これがアプリケーションの名前になります。
次のコードは、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 - モバイル用ワンタイムパスワード