web-dev-qa-db-ja.com

Firebase Auth-プロバイダーIDを取得する

次のコードを使用して、認証プロバイダーを検出し、適切にログアウトします

static func logOut() {
    let auth = FIRAuth.auth()!
    let provider = auth.currentUser?.providerID
    switch provider! {
        case "Facebook": FBSDKLoginManager().logOut()
        case "Google": GIDSignIn.sharedInstance().signOut()
        case "Twitter": Twitter.sharedInstance().sessionStore.logOutUserID(TWTRAPIClient.withCurrentUser().userID!)
        default:
            print("Unknown provider ID: \(provider!)")
            return
    }
    try! auth.signOut()
}

ただし、プロバイダーは常に「Firebase」です。何が悪いのですか? 0_o一度Twitterにログインすると、そのコードで「Facebook」がスローされます。前もって感謝します

UPD:ええ、私は実際には認証プロバイダーをUserDefaultsに格納できますが、それはおそらくFirebaseのバグです。 Firebase SDK 3.5.2を使用しています

17
Dima Rostopira

ユーザーは複数のプロバイダーを使用してFirebase Authenticationアカウントにログインできるため、トップレベルのプロバイダーIDは(通常)Firebaseになります。

しかし currentUserにはproviderDataプロパティ があり、特定のプロバイダーに関する情報を提供します。 FIRAuth.auth()!.currentUser.providerDataをループすると FIRUserInfo.providerID 探しています。

同様の状況にあるUIDに関するこの質問も参照してください。 Firebaseは複数のIDを返します。どちらが一意ですか?

29

Swift 4ソリューション:

   if let providerData = Auth.auth().currentUser?.providerData {
        for userInfo in providerData {
            switch userInfo.providerID {
            case "facebook.com":
                print("user is signed in with facebook")
            case "google.com":
                print("user is signed in with google")
            default:
                print("user is signed in with \(userInfo.providerID)")
            }
        }
    }
8
Alessign

それがどのように構成されているかを確認するために、JSON.stringify(currentUser.providerData)を実行する必要がありました。

結果を文字列化する

そして私はようやくAuth Providerを次のように見つけました:

currentUser.providerData[0].providerId

乾杯、あなたのコードでGL :)

ログアウトするには、より簡単な方法があります。

let authUI = FUIAuth.defaultAuthUI()
do {
    try authUI?.signOut()
} catch let err {
    print(err);
}

一方、プロバイダーを検索し、ユーザーがそのプロバイダーを介してログインしているかどうかを確認する場合は、accessTokenを確認します。 accessTokenを取得するには、プロバイダーに提供した特定のプロバイダーインスタンスが必要です。

私はこれが最初にあなたのクラスであなたのプロバイダーをこのように宣言することによって最もよく達成されると思います:

lazy var facebookProvider = FUIFacebookAuth()
lazy var googleProvider = FUIGoogleAuth()

次に、プロバイダーを提供するとき:

let providers: [FUIAuthProvider] = [ facebookProvider, googleProvider ]

特定のプロバイダーデータが必要な場合:

if let providerData = Auth.auth().currentUser?.providerData {
    for userInfo in providerData {
        switch userInfo.providerID {
        case "facebook.com":
            if !facebookProvider.accessToken.isEmpty {
                print("user is signed in with facebook")
            }
        case "google.com":
            if !googleProvider.accessToken.isEmpty {
                 print("user is signed in with google")
            }
        default:
            print("user is signed in with \(userInfo.providerID)")
        }
    }
}

それ以外の場合は、ユーザーが実際にログインしているかどうかに関係なく、各プロバイダーに関する情報を取得します。

0
David J