簡體   English   中英

嘗試在 Firebase Auth 列表中添加 FB 用戶時出現“錯誤:無效的 IdP 響應/憑據”

[英]Getting "Error: Invalid IdP response/credential" trying to add FB user on Firebase Auth list

我一直致力於在基於 Expo 的應用程序中實現 Facebook 和 Google 登錄方法。

將 Firebase 與我的應用程序連接后,我希望用戶列在 Firebase 用戶中。 雖然谷歌登錄似乎工作正常,但 Facebook 給出了如下來自firebase.auth().signInWithCredential(credential)

[Error: Invalid IdP response/credential: http://localhost?id_token=EAAGUBzIZAgb0BABAkdrj5NcUcvljcsLeNBQlV5VUZAZC7M8e7sSRg2MkqlFCuD7tKjin4uZBep5gSs20oAo8fXKiUqq2deEbUl6HoaAUskTda7x49VCqqcbYh1W3566fMZBtRFB5S3fRV7D41AGVGPMAck91l1KiFCzQzCGtSf5g6ZBKoyHw03LOVONcOiwVZB4vXVcGPYmIzL3RuzzztdBNLRql5ndSk0ZD&providerId=facebook.com] 

這是代碼的相關部分

  1. Firebase.js
// imports, configs and exports omitted
export const facebookProvider = new firebase.auth.FacebookAuthProvider;
  1. LoadingScreen.js(登錄部分)
import firebase, { googleProvider, facebookProvider } from "../firebase";
import * as Facebook from "expo-facebook";

const LoadingScreen = ({ navigation }) => {
  const signInWithFacebook = async () => {
    try {
      await Facebook.initializeAsync("444233602924989");
      const { type, token } = await Facebook.logInWithReadPermissionsAsync(
        "444233602924989",
        {
          permissions: ["public_profile", "email"]
        }
      );
      if (type === "success") {
        const credential = facebookProvider.credential(token);
        onSignInFB(credential);
      } else {
        Alert.alert('FB sign-in failed')
      }
    } catch ({ message }) {
      console.log(`Facebook 1 Error: ${message}`);
      Alert.alert(`first ${message}`);
    }
  };

  const onSignInFB = credential => {
    firebase
      .auth()
      .signInWithCredential(credential)
      .then(function() {
        navigation.navigate("Home");
      })
      .catch(function(error) {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        // The email of the user's account used.
        var email = error.email;
        // The firebase.auth.AuthCredential type that was used.
        var credential = error.credential;
      });
  };
};

我已經記錄了一些元素,如下所示:

  • 雖然沒有可用的錯誤屬性,但錯誤代碼是auth/internal-error Console.logging 錯誤本身產生了錯誤Invalid IdP response/credential
  • 來自logInWithReadPermissionsAsync的令牌是有效的訪問令牌(字符串)
  • 來自facebookProvider.credential(token)credential是:
    Object {"oauthIdToken": "EAAGUBzIZAgb0BAKgeMa5E7qHm8WNJYv5SeuQ8DHyhkUlAnkMhE7niu6tx3e2amSMHSEqG9B0MV4a9dygwgjs337PR7AA3M4PZB2F6x6n1FwAEyZBKhZBpOSE2OWQ9dJipirpafg61TKX36hnKIzaIcwRkjs8YYRBbDuLnZAhJzWst3ZBM5tafwxYKumv2F4kYdexxZAXqb1nosnwYodNvB9bstkcaBrfB8ZD",
      "providerId": "facebook.com",
      "signInMethod": "facebook.com",
    }
  • firebase.auth().currentUsernull

我還查看了我自己的以下可能錯誤的健全清單,但找不到任何錯誤:

  • FB 在 Firebase Auth 登錄中啟用
  • AppId 和 App Secret 從 FB 應用程序正確復制到 Firebase(以及重定向 URI)
  • 將訪問令牌從Facebook.logInWithReadPermissionsAsync傳遞到 Facebook 的訪問令牌調試器,看看是否有任何錯誤(例如過期或無效)
  • 檢查是否從facebookProvider.credential(token)返回實際憑據並傳遞給signInWithCredential

找出問題的根源會很棒! (一種可能性可能是從logInWithReadPermissionsAsync返回的訪問令牌與credential對象中的oauthIdToken屬性相同,但我沒有手動放置或更改其中任何一個。)

謝謝閱讀 :)

我今天對此表示反對,解決方案是將一個對象傳遞給credential調用,即使文檔說傳遞一個字符串。 此外,對象屬性需要被鍵入為accessToken

所以,而不是: const credential = facebookProvider.credential(token);

嘗試: const credential = facebookProvider.credential({ accessToken: token });

根據文檔,我不知道為什么需要該密鑰或為什么它必須是對象,但它在我的情況下有效。 希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM