owned this note
owned this note
Published
Linked with GitHub
###### tags: `第13屆IT邦鐵人賽文章`
# 【在 iOS 開發路上的大小事-Day23】透過 Firebase 將多種 OAuth 身份驗證方式連結在單一帳號上
# 前情提要
你有想過 Line、KKBOX 等 App 上面的「與外部帳號連結」是怎麼做到的嗎
![](https://i.imgur.com/LSiRczH.jpg)
▲ Line
![](https://i.imgur.com/49Rb6rQ.jpg)
▲ KKBOX
其實都是用到類似今天這篇要分享的方法-**與其他帳號連結 (Link To Other Account)**
# 開始實作~
首先先到 Firebase Auth 官方開發文件
點擊「[Link Multiple Auth Providers to an Account on iOS](https://firebase.google.com/docs/auth/ios/account-linking)」
![](https://i.imgur.com/RYWhEc1.png)
在文件中可以看到,如果要將其他身份驗證提供者與單一帳號做連結的話
會需要用到 Credential (憑證) 這個東西,那這個東西要怎麼生出來呢,其實很簡單
因為先前在分享 Google 帳號、Facebook 帳號、Apple ID 登入的時候就已經有產生了
[【在 iOS 開發路上的大小事-Day18】透過 Firebase 來管理使用者 (Sign in with Google 篇) Part2](https://hackmd.io/@leoho0722/HyCi55MeF)
[【在 iOS 開發路上的大小事-Day20】透過 Firebase 來管理使用者 (Sign in with Facebook 篇) Part2](https://hackmd.io/@leoho0722/rkh5_h_et)
[【在 iOS 開發路上的大小事-Day22】透過 Firebase 來管理使用者 (Sign in with Apple 篇) Part2](https://hackmd.io/@leoho0722/rkCg-Io-K)
```swift=
// 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 連接的部分如下
```swift=
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 身份驗證方式連結在一起
```swift=
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)
}
}
}
```
假設有一天突然改變心意,像是變心的人一樣
不想再與其進行連結的話,可以透過下面的方法來解除 (切八段)
```swift=
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 官方文件)](https://firebase.google.com/docs/auth/ios/account-linking)