iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Mobile Development

在 iOS 開發路上的大小事系列 第 23

【在 iOS 開發路上的大小事-Day23】透過 Firebase 將多種 OAuth 身份驗證方式連結在單一帳號上

前情提要

你有想過 Line、KKBOX 等 App 上面的「與外部帳號連結」是怎麼做到的嗎


▲ Line


▲ KKBOX

其實都是用到類似今天這篇要分享的方法-與其他帳號連結 (Link To Other Account)

開始實作~

首先先到 Firebase Auth 官方開發文件
點擊「Link Multiple Auth Providers to an Account on iOS

在文件中可以看到,如果要將其他身份驗證提供者與單一帳號做連結的話
會需要用到 Credential (憑證) 這個東西,那這個東西要怎麼生出來呢,其實很簡單
因為先前在分享 Google 帳號、Facebook 帳號、Apple ID 登入的時候就已經有產生了

【在 iOS 開發路上的大小事-Day18】透過 Firebase 來管理使用者 (Sign in with Google 篇) Part2

【在 iOS 開發路上的大小事-Day20】透過 Firebase 來管理使用者 (Sign in with Facebook 篇) Part2

【在 iOS 開發路上的大小事-Day22】透過 Firebase 來管理使用者 (Sign in with Apple 篇) Part2

// Sign in with Google
let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)

// Sign in with Facebook
let credential = FacebookAuthProvider.credential(withAccessToken: accessToken.tokenString)

// Sign in with Apple
let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: idTokenString, rawNonce: nonce)

接下來就來透過 Credential 來將多種 OAuth 身份驗證提供者通通連結在一起

下面就以 Sign in with Google 來做示範,其他的登入方式做法都是大同小異的~

先前分享的 Sign in with Google 與 Firebase Auth 連接的部分如下

func firebaseSignInWithGoogle(credential: AuthCredential) {
    Auth.auth().signIn(with: credential) { authResult, error in
        guard error == nil else {
            CustomFunc.customAlert(title: "", message: "\(String(describing: error!.localizedDescription))", vc: self, actionHandler: nil)
            return
        }
        CustomFunc.customAlert(title: "登入成功!", message: "", vc: self, actionHandler: self.getFirebaseUserInfo)
    }
}

我們要將它改成下面這樣,透過 Credential 來與其他 OAuth 身份驗證方式連結在一起

func firebaseSignInWithGoogle(credential: AuthCredential) {
    if let user = Auth.auth().currentUser {
        user.link(with: credential) { authResult, error in
            if let error = error {
                CustomFunc.customAlert(title: "", message: "\(String(describing: error.localizedDescription))", vc: self, actionHandler: nil)
                return
            }
            CustomFunc.customAlert(title: "", message: "與其他登入方式的帳號連結成功!", vc: self, actionHandler: nil)
        }
    } else {
        Auth.auth().signIn(with: credential) { authResult, error in
            guard error == nil else {
                CustomFunc.customAlert(title: "", message: "\(String(describing: error!.localizedDescription))", vc: self, actionHandler: nil)
                return
            }
            CustomFunc.customAlert(title: "登入成功!", message: "", vc: self, actionHandler: self.getFirebaseUserInfo)
        }
    }
}

假設有一天突然改變心意,像是變心的人一樣
不想再與其進行連結的話,可以透過下面的方法來解除 (切八段)

let providerID = Auth.auth().currentUser?.providerID
Auth.auth().currentUser?.unlink(fromProvider: providerID!) { user, error in
    if let error = error {
        CustomFunc.customAlert(title: "", message: "\(String(describing: error.localizedDescription))", vc: self, actionHandler: nil)
        return
    }
    CustomFunc.customAlert(title: "", message: "已取消與其他登入方式的帳號連結!", vc: self, actionHandler: nil)
}

總結

以上就是透過 Firebase Auth 來與多個 OAuth 身份驗證提供者進行連結和解除連結的方法~

參考資料:

  1. Link Multiple Auth Providers to an Account on iOS (Firebase Auth 官方文件)

上一篇
【在 iOS 開發路上的大小事-Day22】透過 Firebase 來管理使用者 (Sign in with Apple 篇) Part2
下一篇
【在 iOS 開發路上的大小事-Day24】Firebase 的兩個資料庫介紹
系列文
在 iOS 開發路上的大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言