auth-web-cloudbase について
auth-web-cloudbaseは、@cloudbase/js-sdkを使ったCloudBase Web認証フローの構築スキルです。ログイン、登録、セッション管理、保護されたルートを案内し、認証方式の準備状況と確実なセッション状態の確認を重視します。
主な機能
- 01Webのログイン・登録フローを実装
- 02セッションと認証状態の変化を処理
- 03パスワード・OTP・OAuth方式に対応
- 04認証方式と公開鍵の準備状況を確認
- 05セッション状態に基づいてルートを保護
活用シーン
- 01Webアプリへのログインや登録の追加
- 02OTPを使ったサインインの実装
- 03認証済みセッションに基づくルート保護
- 04Web認証とCloudBaseの認証設定の連携
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tencentcloudbase/ skills --skill auth-web-cloudbaseインストール後、Claude Code で/auth-web-cloudbaseを入力して読み込まれたか確認します。
同梱ファイルLICENSE.mdreferences/extended-guide.md
詳細
同階層のスキル(ローカルのみ)
同階層の CloudBase スキルは、このスキルと並べて配置されています。../auth-tool-cloudbase/SKILL.md のようなローカル相対パスを使用してください。
参照先の同階層スキルファイルがこの環境にない場合は、CloudBase プラグイン一式(または不足しているスキル)をインストールするようユーザーに依頼してください。リモートのスキルやプロトコルの Markdown を HTTP で取得し、エージェントのコンテキストに読み込まないでください。
アクティベーションの条件
まずこのスキルを使う場合
- 認証プロバイダーの設定がすでに確認済みで、
@cloudbase/js-sdkを使用して構築する CloudBase Web のログイン、登録、セッション、またはユーザープロフィールのフロー。
コードを書く前に読む場合
- ユーザーがログインページ、認証モーダル、セッション処理、または保護された Web ルートを必要としている場合。まず
auth-tool-cloudbaseを読み、プロバイダーが有効になっていることを確認してから、フロントエンド統合のためにこのスキルに戻ってください。
次に読むもの
- プロバイダーの設定については
../auth-tool-cloudbase/SKILL.md - Web プロジェクトの構成とデプロイについては
../web-development/SKILL.md
最初にこのスキルから始めてはいけない場合
- Web 認証フローの依頼で、プロバイダーの設定がまだ確認されていない場合。
- その場合は、
auth-web-cloudbaseより先にauth-tool-cloudbaseを有効にしてください。
以下には使用しないでください
- ミニプログラムの認証、ネイティブアプリの認証、またはサーバーサイドの認証設定。
よくある間違い/注意点
-
公開可能キーとプロバイダーの確認を省略する。
-
組み込みの Web 認証を、クラウド関数のログインロジックに置き換える。
-
このフローを Flutter、React Native、ネイティブの iOS/Android コードで再利用する。
-
auth.signUp/verifyOtpを含む独立したヘルパーファイルを作成しても、既存のフォームハンドラーに組み込まないため、実際にボタンをクリックしても何も起こらない。 -
adminやeditorのようなユーザー名形式のアカウントにsignInWithEmailAndPasswordまたはsignUpWithEmailAndPasswordを使用する。 -
アカウント識別子が単なるユーザー名文字列であると明示されているのに、ログインまたは登録のアカウント入力欄を
type="email"のままにする。 -
queryAppAuth(action="getLoginConfig")を呼び出して、usernamePasswordがオフの場合に有効にする前に実装を開始する。 -
MCP でプロバイダーが有効になっていることを最初に確認せずに、
auth.signInWithPassword(...)またはauth.signUp(...)のコードを書く。 ブラウザーでサインインまたはサインアップのコードを書く前に、queryAppAuth(action="listProviders")を呼び出し、対象のプロバイダー(例:email、phone、usernamePassword)のOn: "TRUE"を確認してください。メールベースのサインアップ(auth.signUp({ email, password }))では、SMTP の設定も確認してください。設定されていない場合、プロバイダーから"provider email not found"などのエラーが返されることがあります。ユーザー名/パスワードでログインする場合は、auth.signInWithPassword({ username, password })を使用してください。登録には、管理 API(manageAppAuth(action="createUser"))を使用するか、メールプロバイダーの準備が整っていることを事前に確認する方法が最適です。 -
auth.getUser()または非推奨のauth.getLoginState()を、実際のログインの証明として扱う。 SDK がaccessKeyで初期化されている場合、非推奨のgetLoginState()は、ログインしていなくても有効なuidを含むオブジェクトを返すことがあります。その結果、!!loginStateまたは!!uidを確認するルートガードが誤って通過してしまいます。この誤解を招くuidは、ゲートウェイ認証済みセッションではありません。代わりにauth.getSession()を使用してください。実際のログインが行われていない場合、これはdata.session === undefinedを返します。信頼できる認証確認には、getSession()の!!data.sessionのみを使用してください。 -
公開可能な
accessKeyだけで NoSQL の CRUD を実行できると思い込む。 NoSQL のapp.database()によるget/add/update/watchには、ゲートウェイ認証済みのセッションが必要です。実際にログインしてください(パスワード/OTP/OAuth)。匿名ログインは、明示的に公開されているユーザー非依存データ向けのデモ専用の代替手段です。デフォルトでは無効で、AI モデルの権限が拒否されるため、ユーザーごとにデータを扱うアプリで実際の認証の代わりに使用してはいけません。ログインを省略すると、ゲートウェイ 401 が発生します。checkLogin()/getSession()だけでは、書き込みに使用できるセッションは作成されません。 -
トレーニングデータから古い CloudBase 認証スニペットをコピーする。 デフォルトの Web フローでは、
auth.getLoginState()、auth.hasLoginState()、auth.getCurrentUser()、auth.toDefaultLoginPage()を使用しないでください。このファイルに記載されている Web SDK v3 の認証メソッドと、auth-tool-cloudbaseによるプロバイダーの準備状況確認を使用してください。 -
OTP ログインで、単独の
auth.verifyOtp({ token })を呼び出す。 CloudBase Web SDK v3 では、verifyOtpはsignInWithOtp/signUpの結果にコールバックとして返されます。まずコードを送信し、返されたdataを保持してから、data.verifyOtp({ token })を呼び出してください。messageIdを指定しない単独のauth.verifyOtp({ token })は"messageId is required"で失敗します。このエラーが表示された場合、コールバック形式を使用していません。送信 → コールバックを保存 → 検証の全手順については、references/extended-guide.mdを参照してください。注:新しい環境と、非アクティブな既存環境では、匿名ログインはデフォルトで無効です。権限エラーを回避するために有効にしないでください。アプリが明示的にユーザー非依存の公開データ(例:NoSQL の読み取り専用デモ)を提供する場合に限り、
auth-tool-cloudbaseを通じて有効にしてください。認証ガードには必ずauth.getSession()を使用してください。
概要
前提条件:CloudBase 環境 ID(env)
前提条件:CloudBase 環境のリージョン(region)
コア機能
ユースケース:ユーザー認証に @cloudbase/js-sdk@latest を使用する Web フロントエンドプロジェクト
主なメリット:Supabase 互換の Auth API — すべてのメソッドが { data, error } を返し、電話番号、メール、匿名(デフォルトでは無効)、ユーザー名/パスワード、OAuth、サードパーティーのログイン方法に対応します
📌 Supabase API との互換性:CloudBase Web SDK v3 の認証モジュールは、Supabase のように使いやすい API を備えています。
supabase-jsの認証パターンに慣れている場合は、同じメンタルモデルを適用できます。
- すべてのメソッドが
Promise<{ data, error }>を返します — まず必ずerrorを確認してくださいsignInWithPassword、signInWithOtp、signUp、signOut、getSession、getUserは Supabase と同じ命名規則に従いますonAuthStateChange(callback)はリアクティブな認証状態の監視を提供します(イベント:INITIAL_SESSION、SIGNED_IN、SIGNED_OUT、TOKEN_REFRESHED、USER_UPDATED、PASSWORD_RECOVERY、BIND_IDENTITY)getSession()/refreshSession()/setSession()によるセッション管理は、Supabase のパターンに準じていますSupabase との主な違い:
- OTP 検証:Supabase では独立した
auth.verifyOtp({ phone, token, type })呼び出しを使用します。CloudBase ではverifyOtpはdataのコールバックとして返されます —signInWithOtp/signUpの結果からdata.verifyOtp({ token })を呼び出してくださいaccessKeyは Supabase のanonKeyに相当します。環境設定では Supabase のurlではなく、envとregionを使用しますsignInWithIdTokenはサードパーティーのトークンを使った直接ログイン用です(Supabase の同名メソッドに類似しています)
最新の Web プロジェクトでは npm を使ってインストールしてください。React、Vue、Vite などのバンドラーを使うアプリでは、CDN スクリプトを使わず、プロジェクトの依存関係として @cloudbase/js-sdk をインストールしてインポートしてください。
前提条件
auth-tool-cloudbaseを自動的に使用してqueryAppAuth/manageAppAuthでアプリ側の認証準備状況を確認し、publishable keyを取得してログイン方法を設定してください。- Publishable key の準備状況(省略禁止):
queryAppAuth(action="getPublishableKey")を呼び出してください。値が空の場合は、まずmanageAppAuth(action="ensurePublishableKey")を呼び出してください。新しい環境にはまだキーが用意されていないことがあります。この手順を省略すると、フロントエンドにデータプレーン用の認証情報がないままになり、キーの不足が明確に示されず、後になってゲートウェイの認証エラーとして表面化します。 - キーを保存し、会話内に溜め込まないでください:取得したら、publishable key を
.env.localにVITE_PUBLISHABLE_KEYとして書き込みます(ファイルがなければ作成してください)。クライアントコードではimport.meta.env.VITE_PUBLISHABLE_KEYから読み込んでください。キーをソースファイルに直接埋め込まないでください。また、ユーザーにコンソールから取得するよう依頼しないでください。両方の MCP 呼び出しに失敗した場合に限り、以下のコンソールリンクを案内してください。 auth-tool-cloudbaseが失敗した場合は、https://tcb.cloud.tencent.com/dev?envId={env}#/env/apikeyでpublishable keyを取得し、https://tcb.cloud.tencent.com/dev?envId={env}#/identity/login-manageでログイン方法を設定するようユーザーに案内してください
パラメーター対応表
- ユーザー名形式の識別子では、
queryAppAuth(action="getLoginConfig")のloginMethods.usernamePassword === trueが必要な前提条件です。false の場合は、フロントエンドの認証コードを組み込む前に、manageAppAuth(action="patchLoginStrategy", patch={ usernamePassword: true })で有効にしてください。 - 会話で環境のエイリアス、ニックネーム、その他の略称しか示されていない場合は、まず
queryEnv(action="list", alias=..., aliasExact=true)で解決し、SDK の初期化、コンソールリンク、生成される設定には、返された正式な完全形式のEnvIdを使用してください。cloudbase.init({ env })にエイリアスのような短縮形を直接渡さないでください。 - CloudBase Web Auth は「すべての
supabase-js認証例がそのまま有効」ではなく、Supabase に似たものとして扱ってください。 queryAppAuth/manageAppAuthがsdkStyle: "supabase-like"とsdkHintsを返す場合は、まずそれらのメソッドとパラメーターのヒントに従ってください。auth.signInWithOtp({ phone })とauth.signUp({ phone })では、電話番号にphoneフィールドを使用し、phone_numberは使用しません。auth.signInWithOtp({ email })とauth.signUp({ email })では、emailを使用します。auth.signInWithPassword({ username, password })は、ユーザー名/パスワードアカウントの標準的な Web ログイン方法です。- Web の
auth.signUp({ username, password })を直接使用できるかどうかは条件付きです。まずsdkHintsとインストール済み SDK を確認してください。一部のバージョンではsignUpは OTP/プロバイダートークンのフローのみをサポートしており、ユーザー名/パスワードのユーザーは作成できません。 - タスクで
admin、editorなどの@を含まない単なる文字列のアカウントが指定された場合は、メールアドレスではなく、ユーザー名形式の識別子として扱ってください。 data.verifyOtp({ token })—signInWithOtp/signUpの結果dataにあるverifyOtpコールバック — では、SMS またはメールのコードをtokenに指定します。別途messageIdも必要となる、独立したauth.verifyOtp({ token })の呼び出しを作り出さないでください。accessKeyはauth-tool-cloudbase経由でqueryAppAuth/manageAppAuthから取得するパブリッシャブルキーであり、シークレットキーではありません。accessKeyだけでは、ゲートウェイ認証済みのセッションは作成されません。 パブリッシャブルキーであるaccessKeyは SDK を初期化しますが、NoSQL CRUD のログインに代わるものではありません。app.database()のget/add/update/watchにはセッションが必要です。実際のログイン(パスワード/OTP/OAuth)を優先してください。signInAnonymously()は、明示的に公開されているデモデータに限って使用してください(デフォルトで無効であり、AI モデルの権限は拒否されます)。それ以外の場合、ゲートウェイは 401 を返します。別途、非推奨のauth.getLoginState()はログインしていなくても誤解を招くuidを返すことがあります。ルートガードにはauth.getSession()を使用してください(未ログインの場合、data.session === undefinedになります)。checkLogin()/getSession()だけでは、書き込みに使用できるセッションは作成されません。accessKeyにenvId、ユーザー名、または任意のプレースホルダー文字列を設定しないでください。実際のパブリッシャブルキーがまだない場合は、でっち上げないでください。- タスクでプロバイダーの設定について言及されている場合は、フロントエンドコードを書く前に作業を止めて
auth-tool-cloudbaseを読んでください。
クイックスタート
SDK 初期化リファレンス:docs.cloudbase.net/api-reference/webv3/initialization.md(URL に .md を付けると raw markdown の原文を取得できます)
// npm install @cloudbase/js-sdk
import cloudbase from '@cloudbase/js-sdk'
const app = cloudbase.init({
env: 'your-full-env-id', // Canonical full CloudBase environment ID resolved from queryEnv or the console, not an alias or shorthand
region: 'ap-shanghai', // CloudBase environment Region, default 'ap-shanghai'
accessKey: 'publishable key', // required, get from auth-tool-cloudbase
// ⚠️ accessKey alone ≠ a login session. NoSQL CRUD needs a session —
// real login preferred; signInAnonymously() only for public demo data.
// Use auth.getSession() for route guards; deprecated getLoginState()
// may return a misleading uid without a real session.
auth: { detectSessionInUrl: true }, // required
})
const auth = app.auth
// NoSQL app.database() CRUD requires a session (js-sdk 3.x + publishable key).
// Real login (see cookbook). Anonymous, only for public non-user demos:
// const { error } = await auth.signInAnonymously()
// if (error) throw error
現在のタスクで実際のパブリッシャブルキーを取得していない場合は、キーをでっち上げずに accessKey を省略してください。誤った accessKey は、認証状態の確認や保護されたルートの動作を損なう可能性があります。
認証コードのクックブック(公式 v3 API — .d.ts から再導出せず、以下をコピーしてください)
すべてのメソッドは統一された形式 { data, error } を返します。まず error を確認し、error.message を表示してください。認証 API は従来環境と PG 環境で同一です。出典:公式認証ドキュメント(raw markdown。迷った場合は、そちらのスニペットと照合してください)。
デフォルトの認証 UI の要件: ユーザーが方法を限定せずに 登录/注册/账号体系/user system を求めた場合、ログインページから以下すべてにアクセスできるようにしてください(タブまたは個別フォーム):パスワードでのサインイン、OTP サインイン、検証を伴うサインアップ(コード + パスワード)、パスワードを忘れた場合の手続き(パスワードでのサインインがある場合)。明示的に求められない限り、OTP のみ、またはパスワードのみの UI を提供してはいけません。ユーザー向けの文面で、識別子がすでに登録されているかどうかを明かしてはいけません。中立的な表現で、既存ユーザーをログインに案内してください。
パスワードでのサインイン(ユーザー名形式とメールアドレス形式のどちらの識別子も使用できます):
const { data, error } = await auth.signInWithPassword({ username, password })
// email accounts: auth.signInWithPassword({ email, password })
if (error) { /* show error.message */ } else { /* data.user */ }
匿名サインイン — デモ専用で、デフォルトではありません。 NoSQL の app.database() CRUD ではセッションが必要です(PG の匿名読み取りには accessKey だけで十分です)。実際のログインを優先してください。匿名サインインを使うのは、アプリがユーザーに紐づかない公開データを明示的に提供し、ユーザーがトレードオフを受け入れる場合に限ります。デフォルトでは無効で、AI モデルの権限も拒否されます。また、その uid をユーザー単位の行の所有者にしてはいけません。
const { error } = await auth.signInAnonymously()
登録 — 検証コードは必須です。 パスワードのみのサインアップはありません。signUp 自体がコードを送信し、data.verifyOtp で検証を完了する必要があります。スマートなフロー:識別子が登録済みの場合 → 通常のログイン、新規の識別子の場合 → 登録して自動ログイン。電話番号/SMS は上海地域のみです。メールを優先してください。
const { data, error } = await auth.signUp({ email, password }) // or { phone, password }
if (error) throw error
// user types the code from their inbox...
const { data: login, error: verifyErr } = await data.verifyOtp({ token: code })
// login.user / login.session — signed in on both paths
OTP サインイン(パスワードなし) — signUp と同じ形式で、デフォルトではユーザーを自動作成します(不明なユーザーを拒否するには shouldCreateUser: false を指定します)。コンソールで 邮箱/短信验证码登录 を有効にする必要があります → 身份认证/登录方式:
const { data, error } = await auth.signInWithOtp({ email }) // or { phone }
const { data: login, error: verifyErr } = await data.verifyOtp({ token: code })
パスワードを忘れた場合 — メールコード → 新しいパスワードを設定 → 自動サインイン(PASSWORD_RECOVERY を発行):
const { data, error } = await auth.resetPasswordForEmail(email)
if (error) throw error
const { data: login, error: resetErr } = await data.updateUser({ nonce: code, password: newPassword })
OTP のクロージャと単独の verifyOtp は別物です — 混同しないでください。 signUp/signInWithOtp/resetPasswordForEmail が返す data.verifyOtp にはメッセージ ID が紐づいています({ token } だけを渡します)。単独の auth.verifyOtp(...) には messageId が必要で、ログインのみを行い、登録は行いません。必ず返されたクロージャを使用してください。
セッション確認/ルートガード — 非推奨の getLoginState() は使わず、必ず getSession() を使用してください。
const { data } = await auth.getSession()
const session = data?.session // undefined === not logged in
認証状態リスナー(アプリの起動時に一度だけ設定します):
auth.onAuthStateChange((event, session) => {
// event: INITIAL_SESSION | SIGNED_IN | SIGNED_OUT | PASSWORD_RECOVERY
// | TOKEN_REFRESHED | USER_UPDATED | BIND_IDENTITY
})
サインアウト:
const { error } = await auth.signOut()
ユーザー単位のデータにアクセスする前に、必ず認証ゲートを設けてください。 ユーザー所有の PG 行や Storage オブジェクトを読み書きする前に、セッションを確認し、存在しない場合はログイン画面を表示してください。データエラーを、signInAnonymously をひそかに呼び出して「解決」してはいけません。
const { data } = await auth.getSession()
if (!data?.session) { navigate('/login'); return }
完了基準 — 認証タスクを完了とする前に、生成したソースに以下がすべて含まれている必要があります。
-
signInWithPassword(パスワードログインが UI に含まれる場合) - 検証コードを使うフロー:
signUp+data.verifyOtpおよび/またはsignInWithOtp - ユーザー単位の DB/Storage 呼び出し前の認証ゲート(上記のルール)
- 起動時に
onAuthStateChangeを設定(ルートガードがSIGNED_OUTに反応) -
error.messageからエラーを表示し、エラーメッセージを捏造しない - 権限エラー時のフォールバックとして
signInAnonymouslyを使用しない。モック/localStorage セッションも使用しない
拡張ガイド
詳しいシナリオ、例、パターンについては、extended-guide.md をお読みください。
リファレンス一覧
パッケージに含まれるすべてのリファレンスファイル(スキルの到達性を lint するために必要):