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- OAuth Apps → New OAuth App をクリックします。
- 以下を入力します:
- Application name — 任意の名前 (例:
FIM One) - Homepage URL — フロントエンドのURL (例:
https://yourdomain.com) - Authorization callback URL —
https://yourdomain.com/api/auth/oauth/github/callback
- Application name — 任意の名前 (例:
- Register application をクリックし、次に Generate a new client secret をクリックします。
- Client ID と生成された Client Secret を
.envにコピーします。
read:user, user:email
プライマリメールがプライベートなGitHubアカウントは正しく処理されます — FIM One は常にパブリックプロフィールメールではなく /user/emails からプライマリ検証済みメールを取得します。
- + CREATE CREDENTIALS → OAuth client ID をクリックします。
- プロンプトが表示された場合は、まず OAuth consent screen を設定します(個人用/公開アプリの場合、User Type を「External」に設定します)。
- Application type を Web application に設定します。
- Authorized redirect URIs に以下を追加します:
- Create をクリックし、Client ID と Client Secret をコピーします。
openid, email, profile
注意: 開発中、consent screen に「This app is not verified」という警告が表示されます。テストのためにこれを無視して進めることができます。エンドユーザーの警告を削除したい場合は、consent screen を公開してください。
Discord
開発者コンソール: https://discord.com/developers/applications- New Application をクリックして、アプリケーションに名前を付けます。
- 左側のサイドバーで OAuth2 をクリックします。
- Redirects の下で Add Redirect をクリックして、以下を入力します:
- Client ID(OAuth2 ページの上部に表示)をコピーし、Reset Secret をクリックして Client Secret を表示します。
identify、email
Discord はすべてのアカウントに対して検証済みメールを保証していません。ユーザーが Discord でメールを検証していない場合、nullになる可能性があります。FIM One はこの場合、null メールでアカウントを作成します。ユーザーは後で設定でメールを追加できます。
Feishu (Lark)
開発者コンソール: https://open.feishu.cn/app- Create App → In-house app (自建応用)をクリックします。企業/エンタープライズアカウントが必要です。個人アカウントではFeishu OAuthは利用できません。
- Permissions & Scopesで以下を検索して有効にします:
contact:user.email:readonly
- Security Settings → Redirect URLでコールバックURLを追加します:
- Credentials & Basic InfoセクションからApp IDとApp Secretをコピーします。
contact:user.email:readonly
注: Feishuは標準的なClient ID/Client Secretの命名ではなく、App ID/App Secretを使用します。環境変数の名前はこれを反映しています:FEISHU_APP_IDとFEISHU_APP_SECRET。
重要:Feishu メール動作
Feishu ユーザー情報 API (authen/v1/user_info) は、ユーザーのエンタープライズ連絡先メール(联系邮箱)を返します。これは、Feishu 管理コンソールで組織管理者が設定したアドレスです。これはユーザーの個人的な Feishu ログインメールではありません。
結果:
- 組織管理者が連絡先メールを設定していないユーザーは、有効な Feishu アカウントを持っていても、API からメールフィールドが空になります。
- 個人用 Feishu アカウント(エンタープライズに属していない)のユーザーは、常にメールが空になります。
アカウントバインディングルール
登録済みユーザーは、設定 → アカウントから追加のOAuthプロバイダーをリンクできます。ユーザーがバインディングを開始する際には、以下のルールが適用されます。一般的なルール (GitHub、Google、Discord)
OAuth プロバイダーから返されたメールアドレスは、FIM アカウントに登録されているメールアドレスと一致する必要があります。これにより、他の人のソーシャルアカウントが誤ってあなたの FIM アカウントにリンクされることを防ぎます。 メールアドレスが一致しない場合、バインディングはemail_mismatch エラーで拒否されます。
Feishu例外
FeishuのAPIはログインメールではなくエンタープライズコンタクトメールを返すため、個人アカウントまたは管理者が設定していない組織のアカウントではそのフィールドが空になることが多いため、Feishuのメールマッチチェックはより緩いルールに従います:- 両側にメールがある → メールが一致する必要があります(他のプロバイダーと同じチェック)。
- どちらか一方にメールがない(Feishuが空を返した、またはFIMアカウントにメールがない)→ チケットベースの認証のみに基づいてバインディングが成功します。
Feishuログイン(まだバインドされていない)
ユーザーが初めてFeishuでログインする場合(既存のバインドがない場合):- FIM Oneは、Feishuエンタープライズ連絡先メールアドレスと一致するメールアドレスを持つ既存アカウントを探します。
- 一致するものが見つかった場合、Feishuアカウントは既存のFIMアカウントに自動的にバインドされ、ユーザーはログインします。
- 一致するものがない場合(メールアドレスが空の場合を含む)、Feishuの
open_idで識別される新しいFIMアカウントが作成されます。アカウントはメールアドレスがnullになり、ユーザーは後で設定から入力できます。
環境変数クイックリファレンス
| 変数 | プロバイダー | 必須 | 説明 |
|---|---|---|---|
GITHUB_CLIENT_ID | GitHub | Both | GitHub OAuth App クライアント ID |
GITHUB_CLIENT_SECRET | GitHub | Both | GitHub OAuth App クライアント シークレット |
GOOGLE_CLIENT_ID | Both | Google OAuth 2.0 クライアント ID | |
GOOGLE_CLIENT_SECRET | Both | Google OAuth 2.0 クライアント シークレット | |
DISCORD_CLIENT_ID | Discord | Both | Discord OAuth2 アプリケーション クライアント ID |
DISCORD_CLIENT_SECRET | Discord | Both | Discord OAuth2 アプリケーション クライアント シークレット |
FEISHU_APP_ID | Feishu | Both | Feishu 社内アプリ ID(注:CLIENT_ID ではありません) |
FEISHU_APP_SECRET | Feishu | Both | Feishu 社内アプリ シークレット |
FRONTEND_URL | All | Prod | OAuth 完了後にブラウザーがリダイレクトされる場所(例:https://yourdomain.com) |
API_BASE_URL | All | Prod | 外部からアクセス可能なバックエンド URL、コールバック URL の構築に使用 |
NEXT_PUBLIC_API_URL | All | Prod | OAuth リダイレクト用のブラウザー側 API URL — ビルド時に埋め込まれます |
_ID と _SECRET(Feishu の場合は _APP_ID と _APP_SECRET)の両方を一緒に設定する必要があることを意味します。どちらか一方のみを設定しても効果はありません。
FRONTEND_URL、API_BASE_URL、NEXT_PUBLIC_API_URLの完全なドキュメントについては、環境変数を参照してください。