我正在通过使用OAuthProvider类通过个人Microsoft帐户登录来实现Firebase身份验证。
我已遵循以下说明:https://firebase.google.com/docs/auth/ios/microsoft-oauth?authuser=0
但是,当我使用Firebase SDK的OAuthProvider时,它没有显示Microsoft的登录页面,实际上getCredentialWith不会调用任何内容。
当我使用GoogleAuthProvider时,一切正常,Firebase SDK会显示Google的登录页面。
let provider = OAuthProvider(providerID: "microsoft.com")
provider.scopes = ["files.readwrite.appfolder", "user.read"]
provider.getCredentialWith(nil, completion: { credential, error in
if let error = error {
os_log("Firebase Error: %@", type: .fault, error as CVarArg)
return
}
if (credential != nil) {
Auth.auth().signInAndRetrieveData(with: credential!, completion: { authResult, error in
if let error = error {
os_log("Firebase Error: %@", type: .fault, error as CVarArg)
return
}
})
}
})
答案 0 :(得分:0)
似乎您在本地定义了提供程序。虽然getCredentialWith(_:completion)调用是异步执行的,但是您的本地函数可能已经完成执行,并且提供程序可能已经被ARC释放了。
要解决您的问题,您可能需要将提供程序指针专门保留在某处-例如在您的视图控制器中作为属性或ivar,这样可以在初始化视图控制器时创建/回收提供程序。 / deallocated。
答案 1 :(得分:0)
在全局范围内进行声明,如下所示
var provider: OAuthProvider?
var authMicrosoft: Auth?
@IBAction func buttonTapped(_ sender: Any) {
provider = OAuthProvider(providerID: "microsoft.com")
provider?.customParameters = [
"prompt": "consent",
"login_hint": "",
]
provider?.scopes = ["mail.read", "calendars.read"]
provider?.getCredentialWith(nil ) { credential, error in
if error != nil {
// Handle error.
}
print(credential?.provider)
if let x = credential {
self. authMicrosoft?.signIn(with: x) { authResult, error in
if error != nil {
// Handle error.
}
print(authResult?.additionalUserInfo?.profile)
print(authResult?.user.providerID)
}
} else {
}
}
}