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のログに何も記録されなかったので、
アプリ側に問題があるのかもしれないと思いました。