@aki-touch

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

firebase functionsにデプロイした関数を呼び出しても、見つからないとエラーが出ます

Firebase HTTPS callable を使って関数を呼び出したいです

flutterでアプリを作成しています。

firebase functionsに関数をデプロイして、
callable.callを使用して、アプリから関数を呼び出そうとしています。

アプリ側のコードは次の通りです。

      final callable = FirebaseFunctions.instanceFor(region:"asia-northeast1")
          .httpsCallable('createcustomtoken');

      final response = await callable.call<Map<String, dynamic>>(
        <String, dynamic>{'accessToken': accessToken},
      );

JavaScriptで関数を作成し、
firebase functionsに関数をデプロイしました。

発生している問題・エラー

しかし、以下のように、関数が見つからないというエラーが発生します。

[firebase_functions/not-found] NOT FOUND

以下のドキュメントによると、このエラーはGoogle API の正規エラーコードであるという記載があり、とりあえずfirebaseからの応答は返ってきているのだろうと思っています。

該当するソースコード

firebasefunctionsにデプロイするJavaScriptは、以下のようなコードです。

本体1 メインのコード(JavaScript)

exports.createcustomtoken = functions
  .region('asia-northeast1')
  .https
  .onCall(getcustomtoken);

async function getcustomtoken(callableRequest) {
  try {
    // LINE アクセストークンを検証する
    console.log('LINE アクセストークンを検証中');
    await verifyAccessToken(accessToken);
    console.log('LINE アクセストークンの検証が完了しました');

    // LINE プロフィール情報を取得する
    console.log('LINE プロフィール情報を取得中');
    const { lineUserId, name, imageUrl } = await getLINEProfile(accessToken);
    console.log('LINE プロフィール情報の取得が完了しました');

    // Firebase Auth のカスタムトークンを生成する
    console.log('Firebase Auth のカスタムトークンを生成中');
    const customToken = await admin.auth().createCustomToken(lineUserId);
    console.log('カスタムトークンの生成が完了しました');

    return { customToken };
  } catch (error) {
    console.error('createcustomtoken 関数内でエラーが発生しました:', error.message);
    throw new functions.https.HttpsError('internal', 'カスタムトークンの生成中にエラーが発生しました');
  }
}

verifyAccessToken関数(JavaScript)

const verifyAccessToken = async (accessToken) => {
  try {
      const response = await axios.get(
          `https://api.line.me/oauth2/v2.1/verify?access_token=${accessToken}`
      );
      if (response.status !== 200) {
          throw new Error(`[${response.status}]: GET /oauth2/v2.1/verify`);
      }

      const channelId = response.data.client_id;

      if (channelId !== process.env.LINE_CHANNEL_ID) {
          throw new Error(`LINE Login チャネル ID が正しくありません。`);
      }

      const expiresIn = response.data.expires_in;

      if (expiresIn <= 0) {
          throw new Error(`アクセストークンの有効期限が過ぎています。`);
      }
  } catch (error) {
      throw error;
  }
};

getLINEProfile関数(JavaScript)

const getLINEProfile = async (accessToken) => {
  try {
      const response = await axios.get(`https://api.line.me/v2/profile`, {
          headers: { Authorization: `Bearer ${accessToken}` }
      });

      if (response.status !== 200) {
          throw new Error(`[${response.status}]: GET /v2/profile`);
      }

      return {
          lineUserId: response.data.userId,
          name: response.data.displayName,
          imageUrl: response.data.pictureUrl
      };
  } catch (error) {
      throw error;
  }
};

自分で試したこと

1.firebase functionのダッシュボードで以下を確認しています
・関数がデプロイされていること
・関数名が正しいこと
・リージョン名が正しいこと

関数名とリージョンは、ダッシュボードから直接コードにコピペまでしているので、間違い無いと思います。

2.firebase projects:list で、参照しているプロジェクトが正しい事を確認しています。

firebase projects:list       
✔ Preparing the list of your Firebase projects
┌──────────────────────┬────────────────────────────┬────────────────┬──────────────────────┐
│ Project Display Name │ Project ID                 │ Project Number │ Resource Location ID │
├──────────────────────┼────────────────────────────┼────────────────┼──────────────────────┤
│ jobjobjobj           │ jobjobjobj-bbbbb (current) │ 111111111111   │ [Not specified]      │
├──────────────────────┼────────────────────────────┼────────────────┼──────────────────────┤
│ takahashi-sample-app │ takahashi-sample-app       │ 222222222222   │ [Not specified]      │
└──────────────────────┴────────────────────────────┴────────────────┴──────────────────────┘

3.ログエクスプローラの確認
firebaseのログエクスプローラを確認しましたが、関数をデプロイした時のログのみが出力されているようです。
アプリからfirebase functionsへ関数を呼び出しても、新たなログが追加されません。
記録されていないのだと思います。

4.Postmanで、URLにアクセスしてみました
Postmanでデプロイした関数のURLにアクセスたところ、それがfirebasefunction関連のログにしっかり記録されました。
アプリからfunctionsの関数を呼び出しても、firebaseのログに何も記録されなかったので、
アプリ側に問題があるのかもしれないと思いました。

0 likes

No Answers yet.

Your answer might help someone💌