mcpField
C
clerk-auth-expert

clerk-auth-expert

github.com/kelvincushmanセキュリティ167 回インストール52 週間前に更新
リポジトリ

clerk-auth-expert について

Clerk を使って React Native と Expo アプリの認証を実装する開発者向けスキルです。認証フロー、セッション管理、保護されたルート、ユーザーデータ、Firebase Cloud Functions への JWT 受け渡しを扱います。

主な機能

  1. 01Clerk SDK のセットアップ
  2. 02サインインとアカウント復旧フロー
  3. 03セッションとトークンの管理
  4. 04保護されたナビゲーションルート
  5. 05プロフィールとメタデータの管理
  6. 06Firebase Cloud Functions への JWT 受け渡し

活用シーン

  1. 01Expo アプリへの Clerk 認証の追加
  2. 02SecureStore によるセッション永続化
  3. 03サインイン済みユーザーへの画面制限
  4. 04バックエンド関数への Clerk トークン送信

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kelvincushman/n8ture-ai-app --skill clerk-auth-expert

インストール後、Claude Code で/clerk-auth-expertを入力して読み込まれたか確認します。

詳細

Clerk 認証エキスパート

React Native および Expo アプリケーション向けの Clerk エコシステムに関する深い知識を持つ、Clerk 認証のエキスパートです。このスキルを使うと、N8ture AI App 向けに安全で本番環境に対応した認証フローを実装できます。

主な役割

  • Clerk SDK の実装 - 適切な設定で @clerk/clerk-expo をセットアップします
  • 認証フロー - サインイン、サインアップ、パスワードリセット、ソーシャル認証を構築します
  • セッション管理 - ユーザーセッション、トークンの更新、永続化を処理します
  • 保護されたルート - ナビゲーション用の認証ガードを作成します
  • ユーザー管理 - ユーザープロフィールとメタデータにアクセスし、更新します
  • バックエンド連携 - Clerk JWT トークンを Firebase Cloud Functions に渡します

クイックスタート

インストール
npx expo install @clerk/clerk-expo expo-secure-store
基本設定
// App.js
import { ClerkProvider } from '@clerk/clerk-expo';
import * as SecureStore from 'expo-secure-store';

const tokenCache = {
  async getToken(key) {
    return SecureStore.getItemAsync(key);
  },
  async saveToken(key, value) {
    return SecureStore.setItemAsync(key, value);
  },
};

export default function App() {
  return (
    <ClerkProvider 
      publishableKey={process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY}
      tokenCache={tokenCache}
    >
      <RootNavigator />
    </ClerkProvider>
  );
}

よくあるパターン

保護されたルート
import { useAuth } from '@clerk/clerk-expo';

export function useProtectedRoute() {
  const { isSignedIn, isLoaded } = useAuth();
  const navigation = useNavigation();

  useEffect(() => {
    if (isLoaded && !isSignedIn) {
      navigation.navigate('SignIn');
    }
  }, [isSignedIn, isLoaded]);

  return { isSignedIn, isLoaded };
}
ユーザープロフィールへのアクセス
import { useUser } from '@clerk/clerk-expo';

export function ProfileScreen() {
  const { user } = useUser();

  const updateProfile = async () => {
    await user.update({
      firstName: 'John',
      lastName: 'Doe',
    });
  };

  return (
    <View>
      <Text>Welcome, {user.firstName}!</Text>
      <Text>Email: {user.primaryEmailAddress.emailAddress}</Text>
    </View>
  );
}
バックエンドへのトークンの受け渡し
import { useAuth } from '@clerk/clerk-expo';

export function useAuthenticatedRequest() {
  const { getToken } = useAuth();

  const makeRequest = async (endpoint, data) => {
    const token = await getToken();
    
    const response = await fetch(endpoint, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(data),
    });

    return response.json();
  };

  return { makeRequest };
}

N8ture AI App との連携

トライアル管理

Clerk ユーザーメタデータにユーザーのトライアル回数を保存します:

// Update trial count
await user.update({
  unsafeMetadata: {
    trialCount: 3,
    totalIdentifications: 0,
  },
});

// Check trial status
const trialCount = user.unsafeMetadata.trialCount || 0;
const canIdentify = user.publicMetadata.isPremium || trialCount > 0;
プレミアムサブスクリプションのステータス
// Store subscription status
await user.update({
  publicMetadata: {
    isPremium: true,
    subscriptionId: 'sub_xxx',
  },
});

ベストプラクティス

  1. トークンキャッシュを使用する - SecureStore によるトークンのキャッシュを必ず実装します
  2. 読み込み状態を処理する - 認証状態に依存する UI をレンダリングする前に isLoaded を確認します
  3. メタデータを保護する - 機密性のないデータには publicMetadata を、機密データには privateMetadata を使用します
  4. エラー処理 - 認証エラーに適切に対処するためのエラー処理を実装します
  5. ソーシャル認証 - 実装前に Clerk Dashboard で OAuth プロバイダーを設定します

環境変数

# .env
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_xxxxx

よくある問題

問題:「Clerk が読み込まれていません」
解決策: 認証状態にアクセスする前に、必ず isLoaded を確認します

問題: トークンが永続化されない
解決策: SecureStore のトークンキャッシュが適切に設定されていることを確認します

問題: ソーシャル認証が機能しない
解決策: Clerk Dashboard と app.json で OAuth リダイレクト URL を設定します

リソース

認証を実装するとき、ユーザーセッションを管理するとき、または Clerk を N8ture AI App のバックエンドに連携するときに、このスキルを使用します。

コメント