我正在为使用扩展程序的iOS应用程序创建POC。扩展程序必须知道用户是否经过身份验证。不幸的是,包含应用程序和扩展名是单独的应用程序,这意味着我必须在某处保持身份验证状态。
我不想存储用户电子邮件和密码,而是存储令牌并使用它进行身份验证。但是,尝试使用已发布的令牌和 providerId ( Firebase )进行身份验证似乎确实有效。
同一个Firebase项目下的两个应用。
主要应用(Firebase ios App1):
let userDefatuls = UserDefaults(suiteName: "group.test")
userDefatuls?.set(providerId!, forKey: "providerId")
userDefatuls?.set(value!, forKey: "token")
print("Saved value to user defaults \(value!)")
userDefatuls?.synchronize()
扩展应用(Firebase ios App2):
let userDefaults = UserDefaults(suiteName: "group.test")
let token = userDefaults?.string(forKey: "token")
let providerId = userDefaults?.string(forKey: "providerId")
print("What is the provider id \(providerId)")
let credential = OAuthProvider.credential(withProviderID: providerId!, accessToken: token!)
Auth.auth().signIn(with: credential) { (user, error) in
print("********* What is the user \(user) what is the error \(error)")
}
以上呈现:
什么是用户nil是什么错误:
可选(错误域= FIRAuthErrorDomain代码= 17999“发生内部错误,打印并检查错误详细信息以获取更多信息。”UserInfo = {error_name = ERROR_INTERNAL_ERROR,NSLocalizedDescription =发生内部错误,打印并检查错误有关详细信息的详细信息。,NSUnderlyingError = 0x600000447290 {Error Domain = FIRAuthInternalErrorDomain Code = 3“(null)”UserInfo = {FIRAuthErrorUserInfoDeserializedResponseKey = { 代码= 400; 错误=( { domain = global; message =“INVALID_PROVIDER_ID:不支持提供者ID。”; reason =无效; } ); message =“INVALID_PROVIDER_ID:不支持提供者ID。”; }}}})
你知道支持和工作吗?有什么我做错的吗?
答案 0 :(得分:1)
您无法使用Firebase ID令牌登录。你能做的是: 创建一个带有ID令牌的端点,验证它: https://firebase.google.com/docs/auth/admin/verify-id-tokens
并返回自定义标记: https://firebase.google.com/docs/auth/admin/create-custom-tokens
然后在扩展名中签名加入自定义。
但是,这可能会打开一个漏洞,好像一个短暂的ID令牌被泄露,攻击者可以通过该端点将其交换为永久会话。
如果ID令牌上的auth_time
是最近的,您只能返回自定义令牌。这可确保最近登录的用户可以将其应用与扩展程序同步。