ログイン機能を足そうとして、真っ先に Apple Developer の管理画面と Google Cloud のコンソールを開きかけたことがあります。Sign in with Apple には Services ID が要る、Google には OAuth クライアントが要る——個人開発で自分の手で組んだときの記憶が、先に体を動かしたのです。画面を二つ並べる前に、そもそも Rork に頼むだけで足りるのかどうかが気になり、手が止まりました。
最初にお伝えしたいのは、Rork 公式ドキュメントの記述では、Google と Apple のログインに関して自分で用意する作業は書かれていない、ということです。ただし「何もしなくてよい」とは少し違います。自分で決めること、審査の前に見ておくことは残っています。
なお、この記事は公式ドキュメント(Rork Auth の解説ページ)を読んだ内容が土台です。私自身は、この方式で本番のアプリを出したことはまだありません。手元で動かして確かめたのは、後半に載せる二重導入のチェックスクリプトだけです(模擬のプロジェクトで実行しました)。
Rork が引き受けてくれる部分
公式ドキュメントによると、Rork Auth は「設定なし・バックエンドなし」で Google と Apple のログインを足す仕組みです。チャットで「Google と Apple でログインできるようにして」と頼むと、エージェントが次のことを行います。
- キーの作成と、ログイン画面の追加
- セッションの保持(Swift なら Keychain、Expo なら SecureStore、Web なら localStorage)
- 環境変数の追加(
EXPO_PUBLIC_RORK_APP_KEY、EXPO_PUBLIC_RORK_AUTH_URL、EXPO_PUBLIC_PROJECT_ID、RORK_AUTH_URL、RORK_AUTH_SECRET_KEYの五つ)
そして自分の側の作業として、ドキュメントには「Google Cloud で Google クライアントを作る」「Apple Developer で Sign in with Apple を設定する」「バックエンドを動かす」のいずれも不要と書かれています。管理画面へ向かいかけたのは、別の方式の記憶に引きずられていたのだと思います。
自分で決めることは、残っています
作業は要らなくても、判断は要ります。ドキュメントを読んで、残ると感じたのは次の四点です。
| 場面 | 自分の側にあること |
|---|---|
| 方式を選ぶとき | Rork Auth と Supabase Auth のどちらか一つを選ぶ(両方は不可) |
| 試すとき | シミュレーターでは外部ブラウザが開く。実機ではアプリ内のまま |
| 審査の前 | Apple の規則に沿った画面になっているか見る |
| 公開するとき | Apple Developer Program(年 $99)が必要。構築と試験には不要 |
方式は一つだけ選びます
ドキュメントには「1 つのプロジェクトは、どちらか一方だけを使う。両方は使わない」と書かれています。両方を入れると、ユーザーが二つの表に分かれて入ります。あとで切り替えると、既存のユーザーは登録し直しになります。
Rork Auth が対応するのは Google と Apple の二つだけで、サインイン中に追加の質問を挟むことや、アカウントの移行はできません。メールとパスワード、マジックリンク、電話番号コードで入れたい場合は Supabase Auth の側です。後者は、確認メールが汎用の送信元から出て数も制限されるため、実際の利用者が増える前に自分の送信元を設定しておく必要があります。
審査で見られる三点
私が個人開発で審査前に見直す項目と重なりますが、ドキュメントが挙げているのは、Apple でログインした後に名前とメールをもう一度聞かないこと、@privaterelay.appleid.com のような隠しメールを受け入れること、Apple のボタンを Google のボタンと同じ目立ち方にすることです。生成された画面でこの三つが守られているかは、公開の前に自分の目で見ておくのが安全です。
試すときの見え方
シミュレーターでは、Google や Apple のウィンドウが電話の画面の中ではなく、自分のブラウザで開きます。実機ではアプリの中に留まります。また、セッションはアプリを入れ直しても残るので、テスト中はアプリ内のサインアウトボタンを使います。
頼む前に、二重導入していないか確かめます
既にメールとパスワードのログインを Supabase で作ってあるプロジェクトに、Google と Apple のログインを重ねて頼むと、二つの方式が同居します。画面にログイン後の空白が出る原因も、このずれであることが多いと、公式ドキュメントは触れています(データ側の規則が user_id() と auth.uid() のどちらを前提にしているか)。
次のスクリプトは、プロジェクトのフォルダを渡すと、Rork Auth の環境変数と Supabase Auth の呼び出しがそれぞれどのファイルにあるかを一覧にします。
import pathlib, re, sys
root = pathlib.Path(sys.argv[1])
rork_pat = re.compile(r"RORK_AUTH_URL|RORK_AUTH_SECRET_KEY|EXPO_PUBLIC_RORK_APP_KEY")
supa_pat = re.compile(r"supabase\.auth\.(signUp|signInWithPassword|signInWithOtp|signInWithOAuth)|auth\.uid\(\)")
hits = {"rork": [], "supabase": []}
for p in root.rglob("*"):
if p.suffix not in {".ts", ".tsx", ".js", ".sql", ".env", ".swift"} or "node_modules" in p.parts:
continue
text = p.read_text(errors="ignore")
if rork_pat.search(text):
hits["rork"].append(str(p.relative_to(root)))
if supa_pat.search(text):
hits["supabase"].append(str(p.relative_to(root)))
print("Rork Auth の痕跡 :", hits["rork"] or "なし")
print("Supabase Auth の痕跡:", hits["supabase"] or "なし")
if hits["rork"] and hits["supabase"]:
print("⚠ 両方あります。ユーザー表が二つに分かれていないか確かめてください")模擬のプロジェクト(Rork Auth の環境変数を読むファイルと、signInWithPassword を呼ぶファイルを一つずつ置いたもの)で実行すると、最後の一行に警告が出ました。実際のプロジェクトで使うときは、エクスポートしたフォルダを渡す形になります。私なら、既存のプロジェクトに足す依頼を送る前に、必ずこの一回を挟みます。結果はあくまで目安で、警告が出たら「どちらを残すか」を自分で決める入口にしてください。
頼み方の叩き台
方式を選んだ後の依頼は、短くて構いません。
Rork Auth で Google と Apple のログインを追加してください。
メールとパスワードのログインは使いません。
ログイン後に、プロフィール画面とサインアウトのボタンを作ってください。二行目を入れておくと、エージェントが別の方式を足す余地が減ります。
頼む前に、方式を一つだけ口に出しておく。 この線引きを先に置いてから、管理画面を開く癖を直しているところです。
Supabase を自分で組む方式の詳しい実装は、Rork アプリに Sign in with Apple を組み込む手順に書いています。サーバー側の検証まで進めたくなったときは、サーバー検証とアカウント削除まで扱うガイドが次の一冊になります。
次にログインを足すときは、依頼を送る前にフォルダへ上のスクリプトを一度流して、二つの方式の痕跡が混ざっていないかを見てみていただければと思います。