ログイン
パスワードを確認したら、ユーザーの ID、ブラウザーの情報、(あれば)記憶したデバイスの Cookie を渡して beginSecondStep を呼びます。返された SecondStep はサーバー側のセッションに保存してください。Cookie や hidden フィールドには絶対に入れないでください。
SecondStep step = tenonAuth.beginSecondStep(account.id(), new SignInContext(request.getRemoteAddr(), request.getHeader("User-Agent")), cookie(request, "tenon_device"), locale.getLanguage());const step = await tenonAuth.beginSecondStep(account.id, { context: { ipAddress: req.ip, userAgent: req.get('user-agent') }, trustedDeviceToken: req.cookies.tenon_device, language: 'ja',});step = tenon_auth.begin_second_step(str(account.id), SignInContext(client_ip, user_agent), trusted_device_token=request.cookies.get("tenon_device"), language="ja")var step = await tenonAuth.BeginSecondStepAsync(account.Id.ToString(), new SignInContext(HttpContext.Connection.RemoteIpAddress?.ToString(), Request.Headers.UserAgent), Request.Cookies["tenon_device"], "ja");表示する画面
Section titled “表示する画面”kind |
画面 | 次に |
|---|---|---|
CODE_ENTRY |
コード入力画面:6桁を入れる欄が1つ。method が EMAIL のときは、送信先(emailSentTo、一部を伏せたもの)を示し、「新しいコードを送る」を用意します(30秒後に、もう一度 beginSecondStep を呼ぶ) |
completeWithCode |
PUSH_WAIT |
待機画面:「スマートフォンでログインを承認し、42 を選んでください」(number)。2秒ごとに再読み込み、または JavaScript で確認します |
PENDING でなくなるまで pollApproval |
TRUSTED |
なし:記憶したブラウザー | ログイン |
NO_METHOD |
ユーザーはまだ方法を設定していません。パスワードだけでログインさせるか、先に設定を求めるかは、あなたのポリシーで決めます | |
RECOVERY_ONLY |
メールを送れませんでした。リカバリー画面だけを表示します | completeWithRecoveryCode |
コード入力画面と待機画面には、「スマートフォンをなくしましたか? リカバリーコードを使う」のリンクを置きます。リンク先のリカバリー画面は、リカバリーコードまたはヘルプデスクのアクセスパスを入れる欄が1つで、completeWithRecoveryCode を呼びます。
status |
すること |
|---|---|
APPROVED |
ログインさせます。ユーザーがチェックを入れていれば、ブラウザーを記憶します(下記) |
WRONG_CODE |
「コードが違います。残り attemptsRemaining 回」と表示して、画面をもう一度出します |
PENDING |
ログイン承認:待ち続けます |
DENIED |
ユーザーがスマートフォンで「自分ではない」と答えました。ログインを終了し、パスワードの変更を勧めてください。だれかがパスワードを知っています |
FAILED |
間違いが多すぎます:パスワードの入力からやり直します |
EXPIRED |
時間切れ:パスワードの入力からやり直します |
FactorLocked(例外・エラー)は、10回続けて間違えたことを意味します。その方法は lockedUntil までロックされます。その時刻を表示し、リカバリー画面を案内してください。
「このデバイスでは次回から確認しない」
Section titled “「このデバイスでは次回から確認しない」”コード入力画面と待機画面にチェックボックスを用意します。チェックされていて、結果が APPROVED のとき:
TrustedDevice device = tenonAuth.rememberDevice(step.userId(), step.challengeId());// Cookie "tenon_device" = device.token():HttpOnly、Secure、SameSite=Lax、device.expiresAt()(14日)まで。const device = await tenonAuth.rememberDevice(step.userId, step.challengeId!);res.cookie('tenon_device', device.token, { httpOnly: true, secure: true, sameSite: 'lax', expires: device.expiresAt });device = tenon_auth.remember_device(step.user_id, step.challenge_id)response.set_cookie("tenon_device", device.token, httponly=True, secure=True, samesite="Lax", expires=device.expires_at)var device = await tenonAuth.RememberDeviceAsync(step.UserId, step.ChallengeId!.Value);Response.Cookies.Append("tenon_device", device.Token, new CookieOptions { HttpOnly = true, Secure = true, SameSite = SameSiteMode.Lax, Expires = device.ExpiresAt });記憶したブラウザーが使えなくなるとき:
- ユーザーが方法を変更または削除したとき
- 管理者がすべてのデバイスからログアウトさせたとき
- 14日経ったとき
トークンは、そのユーザーにしか使えません。
language(ja または en)は、メールのコードの言語です。指定しなければ日英併記になります。スマートフォンは、それぞれの言語で要求を表示します。
ユーザーに見える制限
Section titled “ユーザーに見える制限”- 承認の要求とメールは、ユーザーごとに15分間で5回まで:
retryAfterつきのTooManyRequestsエラー。 - メールのコードは、30秒に1回まで。
- これらはログインの失敗ではなく、「しばらくお待ちください」と表示してください。