メインコンテンツへスキップ
FIM One は GitHub、Google、Discord、Feishu (Lark) 経由のソーシャルログインをサポートしています。環境に認証情報が存在するプロバイダーは、コード変更なしでサインインページにログインボタンを自動的に表示します。 コールバック URL パターン — 各プロバイダーの開発者コンソールにこの正確な URL を登録してください:
{API_BASE_URL}/api/auth/oauth/{provider}/callback
API_BASE_URL は FIM One バックエンドの外部からアクセス可能なアドレスです。例:
シナリオコールバック URL の例
ローカル開発http://localhost:8000/api/auth/oauth/github/callback
専用 API サブドメインhttps://api.yourdomain.com/api/auth/oauth/github/callback
リバースプロキシ(同一ドメイン)https://yourdomain.com/api/auth/oauth/github/callback

GitHub

デベロッパーコンソール: https://github.com/settings/developers
  1. OAuth AppsNew OAuth App をクリックします。
  2. 以下を入力します:
    • Application name — 任意の名前 (例: FIM One)
    • Homepage URL — フロントエンドのURL (例: https://yourdomain.com)
    • Authorization callback URLhttps://yourdomain.com/api/auth/oauth/github/callback
  3. Register application をクリックし、次に Generate a new client secret をクリックします。
  4. Client ID と生成された Client Secret.env にコピーします。
自動的にリクエストされるスコープ: read:user, user:email プライマリメールがプライベートなGitHubアカウントは正しく処理されます — FIM One は常にパブリックプロフィールメールではなく /user/emails からプライマリ検証済みメールを取得します。
GITHUB_CLIENT_ID=Ov23li...
GITHUB_CLIENT_SECRET=...

Google

デベロッパーコンソール: https://console.cloud.google.com/apis/credentials
  1. + CREATE CREDENTIALSOAuth client ID をクリックします。
  2. プロンプトが表示された場合は、まず OAuth consent screen を設定します(個人用/公開アプリの場合、User Type を「External」に設定します)。
  3. Application typeWeb application に設定します。
  4. Authorized redirect URIs に以下を追加します:
    https://yourdomain.com/api/auth/oauth/google/callback
    
  5. Create をクリックし、Client IDClient Secret をコピーします。
自動的にリクエストされるスコープ: openid, email, profile
注意: 開発中、consent screen に「This app is not verified」という警告が表示されます。テストのためにこれを無視して進めることができます。エンドユーザーの警告を削除したい場合は、consent screen を公開してください。
GOOGLE_CLIENT_ID=12345678-abc.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-...

Discord

開発者コンソール: https://discord.com/developers/applications
  1. New Application をクリックして、アプリケーションに名前を付けます。
  2. 左側のサイドバーで OAuth2 をクリックします。
  3. Redirects の下で Add Redirect をクリックして、以下を入力します:
    https://api.yourdomain.com/api/auth/oauth/discord/callback
    
  4. Client ID(OAuth2 ページの上部に表示)をコピーし、Reset Secret をクリックして Client Secret を表示します。
自動的にリクエストされるスコープ: identifyemail
Discord はすべてのアカウントに対して検証済みメールを保証していません。ユーザーが Discord でメールを検証していない場合、email フィールドは null になる可能性があります。FIM One はこの場合、null メールでアカウントを作成します。ユーザーは後で設定でメールを追加できます。
DISCORD_CLIENT_ID=123456789012345678
DISCORD_CLIENT_SECRET=...

Feishu (Lark)

テナントスコープのみ。 Feishuの自建応用は、アプリを作成した同じエンタープライズテナント内のユーザーのみを認証できます。他のFeishuテナントのユーザーには「権限なし」エラーが表示されます。つまり、Feishu OAuthは異なる組織のユーザーが利用するパブリックSaaS展開には適していません。すべてのユーザーが同じFeishuテナントに属するプライベート/単一組織の展開に適しています。クロステナントのFeishuログインをサポートするには、アプリをFeishuアプリストアに公開し、Feishuのレビュープロセスに合格する必要があります。これは複雑で厳しい要件があります。
開発者コンソール: https://open.feishu.cn/app
  1. Create AppIn-house app (自建応用)をクリックします。企業/エンタープライズアカウントが必要です。個人アカウントではFeishu OAuthは利用できません。
  2. Permissions & Scopesで以下を検索して有効にします:
    • contact:user.email:readonly
  3. Security SettingsRedirect URLでコールバックURLを追加します:
    https://yourdomain.com/api/auth/oauth/feishu/callback
    
  4. Credentials & Basic InfoセクションからApp IDApp Secretをコピーします。
コンソールで設定されたスコープ(認可URLではなく): contact:user.email:readonly
注: Feishuは標準的なClient ID / Client Secretの命名ではなく、App ID / App Secretを使用します。環境変数の名前はこれを反映しています: FEISHU_APP_IDFEISHU_APP_SECRET
FEISHU_APP_ID=cli_a1b2c3d4e5f6...
FEISHU_APP_SECRET=...

重要:Feishu メール動作

Feishu ユーザー情報 API (authen/v1/user_info) は、ユーザーのエンタープライズ連絡先メール(联系邮箱)を返します。これは、Feishu 管理コンソールで組織管理者が設定したアドレスです。これはユーザーの個人的な Feishu ログインメールではありません 結果:
  • 組織管理者が連絡先メールを設定していないユーザーは、有効な Feishu アカウントを持っていても、API からメールフィールドが空になります。
  • 個人用 Feishu アカウント(エンタープライズに属していない)のユーザーは、常にメールが空になります。
FIM One はこれを適切に処理します。詳細は下記のアカウント バインディング ルールを参照してください。

アカウントバインディングルール

登録済みユーザーは、設定 → アカウントから追加のOAuthプロバイダーをリンクできます。ユーザーがバインディングを開始する際には、以下のルールが適用されます。

一般的なルール (GitHub、Google、Discord)

OAuth プロバイダーから返されたメールアドレスは、FIM アカウントに登録されているメールアドレスと一致する必要があります。これにより、他の人のソーシャルアカウントが誤ってあなたの FIM アカウントにリンクされることを防ぎます。 メールアドレスが一致しない場合、バインディングは email_mismatch エラーで拒否されます。

Feishu例外

FeishuのAPIはログインメールではなくエンタープライズコンタクトメールを返すため、個人アカウントまたは管理者が設定していない組織のアカウントではそのフィールドが空になることが多いため、Feishuのメールマッチチェックはより緩いルールに従います:
  • 両側にメールがある → メールが一致する必要があります(他のプロバイダーと同じチェック)。
  • どちらか一方にメールがない(Feishuが空を返した、またはFIMアカウントにメールがない)→ チケットベースの認証のみに基づいてバインディングが成功します。

Feishuログイン(まだバインドされていない)

ユーザーが初めてFeishuでログインする場合(既存のバインドがない場合):
  1. FIM Oneは、Feishuエンタープライズ連絡先メールアドレスと一致するメールアドレスを持つ既存アカウントを探します。
  2. 一致するものが見つかった場合、Feishuアカウントは既存のFIMアカウントに自動的にバインドされ、ユーザーはログインします。
  3. 一致するものがない場合(メールアドレスが空の場合を含む)、Feishuのopen_idで識別される新しいFIMアカウントが作成されます。アカウントはメールアドレスがnullになり、ユーザーは後で設定から入力できます。

環境変数クイックリファレンス

変数プロバイダー必須説明
GITHUB_CLIENT_IDGitHubBothGitHub OAuth App クライアント ID
GITHUB_CLIENT_SECRETGitHubBothGitHub OAuth App クライアント シークレット
GOOGLE_CLIENT_IDGoogleBothGoogle OAuth 2.0 クライアント ID
GOOGLE_CLIENT_SECRETGoogleBothGoogle OAuth 2.0 クライアント シークレット
DISCORD_CLIENT_IDDiscordBothDiscord OAuth2 アプリケーション クライアント ID
DISCORD_CLIENT_SECRETDiscordBothDiscord OAuth2 アプリケーション クライアント シークレット
FEISHU_APP_IDFeishuBothFeishu 社内アプリ ID(注:CLIENT_ID ではありません)
FEISHU_APP_SECRETFeishuBothFeishu 社内アプリ シークレット
FRONTEND_URLAllProdOAuth 完了後にブラウザーがリダイレクトされる場所(例:https://yourdomain.com
API_BASE_URLAllProd外部からアクセス可能なバックエンド URL、コールバック URL の構築に使用
NEXT_PUBLIC_API_URLAllProdOAuth リダイレクト用のブラウザー側 API URL — ビルド時に埋め込まれます
「Required: Both」は _ID_SECRET(Feishu の場合は _APP_ID_APP_SECRET)の両方を一緒に設定する必要があることを意味します。どちらか一方のみを設定しても効果はありません。
FRONTEND_URLAPI_BASE_URLNEXT_PUBLIC_API_URL の完全なドキュメントについては、環境変数を参照してください。