react native expoでfairebaseを使ってFacebookログインをする。
概要
タイトル通りでそこらじゅうに記事あるじゃん、って感じなんですけどうまくいかないんですよね。色々試したんでまとめます。
expo SDK44
firebase 9.6.11
expo-facebook 12.1.1
大前提
ブラウザやQRコードからスマホのExpo GO
経由で起動したアプリでは動かすことができません。standaloneでbuildしたアプリでしか動かないので注意してください。
eas build --profile preview --platform ios
で実機で試しました。iosのシミュレーターで試す場合は"simulator": trueが必要です。
試してませんがexpo build
でも動くはず。
expo build:ios
コード
// app.config.ts(app.json)
...
facebookScheme: "fb[FACEBOOK APP ID]",
facebookAppId: "[FACEBOOK APP ID]",
facebookDisplayName: "[FACEBOOK APP NAME]"
}
}
import { FacebookAuthProvider, signInWithCredential } from "firebase/auth";
import * as Facebook from 'expo-facebook';
import Constants from 'expo-constants';
import { auth } from './firebase';
<Button onPress={e => {
Facebook.initializeAsync({appId: Constants.manifest?.facebookAppId}).then(() => {
return Facebook.logInWithReadPermissionsAsync({ permissions: ['public_profile', 'email'] })
}).then(result => {
if(result.type == 'success'){
const credential = FacebookAuthProvider.credential(result.token);
return signInWithCredential(auth, credential)
}
return;
}).catch(error => {
console.log('error', error)
})
}}>
Facebookでログイン
</Button>
解説
Expo GO
経由で起動したアプリだと下記のエラーが出ます。
FirebaseError: Firebase: Unsuccessful debug_token response from Facebook: {"error":{"message":"(#100) The App_id in the input_token did not match the Viewing App","type":"OAuthException","code":100,"fbtrace_id":"Aw6Cd98alCiqYT9wtlw940V"}} (auth/invalid-credential).
Expo GO
経由で起動したアプリだと、Expo GO
のFacebookAppIDが飛んで、FacebookからはExpo GO
がログインを試みたように見えるようですね。
firebaseのコンソールに登録した自分のアプリとは当然FacebookAppIDが違うのでThe App_id in the input_token did not match the Viewing App
となります。
ビルドしたアプリで実行すると自分のFacebookAppIDが飛ぶのですが、最初コードに示したapp.json
の記述はなしで
Facebook.initializeAsync({appId: "[FACEBOOK APP ID]", appName: "[[FACEBOOK APP NAME]]"})
とinitializeAsync
に渡していたのですがこれだと下記のエラーでログインできません。
Error: fb[FACEBOOK APP ID] is not registered as a URL scheme. Please add it in your Info.plist
何度もビルドして試した結果、最低限app.jsonに下記の二つの設定が必要なようです。
// app.config.ts(app.json)
...
facebookScheme: "fb[FACEBOOK APP ID]",
facebookDisplayName: "[FACEBOOK APP NAME]"
}
}
どうせapp.json
に必要ならここで全部管理した方がいいと思い、FB関連の設置をここに移動し、コードをFacebook.initializeAsync({})
としてみたけど、appIdだけは引数に渡さないとダメでした。
Error: No FacebookAppId configured, required for initialization. Please ensure that you're either providing `appId` to `initializeAsync` as an argument or inside Info.plist.
書き出されたアプリのInfo.plist
はコンテキストメニューからShow package contents
で確認できますが、正しいFacebookAppId
が書き出されているにもかかわらず上記のエラーでした。これだけはinitializeAsync
の引数に渡す必要があります。
ということで示したコードに落ち着きました。
なんか、色々エラーメッセージやドキュメントとは違う仕様のようです。なんでこんなややこしいねん。
参考URL
公式ドキュメント
ちなみに、このfirebaseの公式にあるsignInWithRedirect
やsignInWithPopup
はブラウザのみでExpoからは使えません。expo-facebook
とfirebaseのsignInWithCredential
を組み合わせてログインします。
参考になったエントリー
Discussion