サインイン方法
アプリのユーザーがサインインする方法を選びます。メールアドレスとパスワード、メールリンク、Runlot、独自の GitHub・Google アプリ、任意の OpenID Connect プロバイダーから選べます。
サインイン方法はすべて 1 つの一覧にまとまっています。ダッシュボードの サインインとアクセス タブの アプリのユーザー にすべて表示され、runlot auth status も同じ一覧を出力します。
| 方法 | オン・オフ |
|---|---|
| メールアドレスとパスワード | runlot auth set password on|off |
| メールリンク | runlot auth set magic-link on|off |
| Runlot | runlot auth provider runlot on|off |
| 独自の GitHub・Google アプリ | runlot auth provider set github|google …、runlot auth provider rm … |
| OIDC プロバイダー | runlot auth provider oidc add <id> …、runlot auth provider oidc rm <id> |
プロバイダーを変更するには admin ロールが必要です。
409 last_method で拒否されます。アプリにサインインがまったく不要なら、ログイン機能自体をオフにしてください。メールアドレスとパスワード、メールリンク
どちらも既定でオンです。
runlot auth set password off # パスワードのフォームを隠す
runlot auth set magic-link off # メールリンクを隠すパスワードのサインインをオフにすると、パスワードのルートは 404 method_disabled を返し、既定のサインイン画面からフォームが消えます。保存済みのパスワードハッシュは残るため、再びオンにすればそのアカウントでサインインできます。両方オフでも確認メールは送信されます。ソーシャルログインだけのアプリでもメールアドレスの確認は必要だからです。
Runlot
runlot auth provider runlot onサインイン画面に Runlot で続ける ボタンが 1 つ表示されます。押すとアプリ名とロゴが表示された Runlot の画面に移動し、メールアドレスとパスワード、Google、GitHub のいずれかでサインインします。終わるとサインインした状態でアプリに戻ります。登録する client ID、シークレット、コールバック URL はなく、カスタムドメインを追加しても変更は不要です。
ユーザーはアプリに ID プロバイダー runlot として保存されます。subject はアプリごとに異なる値 (pairwise ID) なので、同じ人でもアプリごとに subject が変わり、2 つのアプリがこの値でユーザーを突き合わせることはできません。メールアドレスは Runlot が確認済みの場合にだけ渡されます。
インストール環境で Runlot のサインインが提供されていない場合、コマンドは 409 runlot_unavailable を返します。
runlot auth provider runlot off独自の GitHub・Google アプリ
プロバイダーの同意画面にアプリ名を表示したい場合、独自のクォータを使いたい場合、GitHub Enterprise Server を使う場合は、独自の OAuth アプリを登録してください。
runlot auth provider set github --client-id <id> --client-secret <secret>
runlot auth provider set google --client-id <id> --client-secret <secret>--client-secret を省略すると、ターミナルで値の入力を求められます。
セルフホスト 環境で GitHub が GitHub Enterprise Server の場合は、github の行に --issuer https://github.acme.example を付けてください。このオプションは github 専用で、ダッシュボードにも同じ入力欄があります。
OpenID Connect プロバイダー
OpenID Connect に対応したプロバイダーなら、好きな ID で追加できます。LINE、Apple、Microsoft Entra、Okta、Keycloak、社内 IdP などです。
runlot auth provider oidc add <id> --issuer https://idp.example.com \
--client-id <client-id> [--name "Example"] [--icon https://…/icon.svg] [--scopes "openid email profile"]
# クライアントシークレットはプロンプトで入力します
runlot auth provider oidc rm <id><id>は自分で決める短い名前です。英小文字で始まり、英小文字・数字・ハイフンで 2〜31 文字です。github、google、runlotは使えません。--issuerはhttpsである必要があります。保存時に<issuer>/.well-known/openid-configurationを読み取り、失敗すると400 oidc_discovery_failedとプロバイダーの応答を返して保存しません。--scopesを省略するとopenid email profileを使います。
サインインのたびに ID トークンの署名、issuer、audience、有効期限、nonce を検証します。メールアドレスの確認状態 (email_verified) を返さないプロバイダーで作られたユーザーは 未確認 になり、メールアドレスが同じでも既存のアカウントとは連携されません。
ダッシュボードの OIDC プロバイダーを追加 にも同じ入力欄があり、保存前にコールバック URL が表示されます。
例: Kakao
Kakao ログインは OpenID Connect をオンにすると OIDC で接続できます。
- Kakao Developers のコンソールでアプリを開き、Kakao Login で OpenID Connect をオンにします。
- Redirect URI にコールバック URL
https://<your-domain>/__runlot/auth/callback/kakaoを登録します。 - プロバイダーを追加します。client ID はアプリの REST API キー、シークレットはセキュリティ設定の Client Secret です。
runlot auth provider oidc add kakao --issuer https://kauth.kakao.com \
--client-id <REST API キー> --name "Kakao"コールバック URL
独自の GitHub・Google アプリと OIDC アプリは、プロバイダーのコンソールに次の URL を登録する必要があります。プロジェクトが応答する ホストごとに 1 回ずつ 登録してください。Runlot は登録不要です。
https://<your-domain>/__runlot/auth/callback/<id>正確な一覧は runlot auth status で確認できます。カスタムドメインを追加したら、そのコールバック URL もプロバイダーのコンソールに追加してください。漏れたホストではサインインに失敗し、エラーはプロバイダー側にしか表示されません。
登録とメールの設定も適用されます
allowSignup と requireVerifiedEmail はすべての方法に同じように適用されます。登録をオフにすると、どのプロバイダーからも新しいユーザーは作れません。メール確認を必須にすると、メールアドレスを保証しないプロバイダーではセッションを受け取れません。
独自のサインイン画面から使う
オンにした方法は既定のサインイン画面にボタンとして表示されます。独自のサインイン画面では、ボタンをハードコードせず、オンになっている方法を問い合わせてください。
import { providers, signInUrl } from "@runlot/auth/client";
for (const p of await providers()) {
// p.id は "runlot"、"github"、"google" または独自の OIDC ID。OIDC の項目には name と icon があります
render(<a href={signInUrl(p.id, { next: "/app" })}>Continue with {p.name ?? p.id}</a>);
}signInUrl("github", { next: "/app" }) は /__runlot/auth/sign-in/github?next=%2Fapp へのリンクになります。next が外部 URL の場合や // で始まる場合は、セキュリティのため無視されます。
同じメールアドレスのアカウント連携
パスワードのサインインとプロバイダーが同じ確認済みメールアドレスを使う場合、1 つのユーザーアカウントに連携されます。ユーザーが使っているプロバイダーは user.providers で確認できます。
const user = await env.auth.user(request);
user.providers; // ["password", "github"]プロバイダーの削除
runlot auth provider rm github削除したプロバイダーだけでサインインしていたユーザーは、パスワードのサインインがオンであれば、パスワードを再設定して再びアクセスできます。