Firebase Google SignIn 每次都会询问权限
Posted
技术标签:
【中文标题】Firebase Google SignIn 每次都会询问权限【英文标题】:Firebase Google SignIn asks every time for permissions 【发布时间】:2016-12-27 10:11:54 【问题描述】:我已按照 Firebase 指南在我的 ios 应用中使用 Firebase 实现了 Google SignIn。问题是每次我测试登录时,它总是要求权限。
以下是 Google SignIn 中涉及的 AppDelegate 的代码:
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
// Override point for customization after application launch.
FIRApp.configure()
GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID
GIDSignIn.sharedInstance().delegate = self
return true
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
return GIDSignIn.sharedInstance().handle(url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!)
if let error = error
print(error.localizedDescription)
return
print("Logged in with Google successfull")
// ... Firebase authentication ...
这里是带有 GIDSignInButton 的 View Controller 的代码:
import UIKit
class IntroViewController: UIViewController, GIDSignInUIDelegate
@IBOutlet weak var signInButton: GIDSignInButton!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
GIDSignIn.sharedInstance().uiDelegate = self
signInButton.style = .wide
我在网上搜索了很多,但一无所获...那么,如何防止每次都请求许可?
【问题讨论】:
请添加更多信息 @renjithr 我已经编辑并添加了更多信息 对不起,如果我在语言上犯了一些错误,我是意大利人 可能重复/相关:GIDSignIn set approval_prompt 它不会要求我提供离线权限 【参考方案1】:我相信这是按预期工作的。问题是您在测试应用程序时要退出用户,并且 Google 登录库假设如果用户已明确退出您的应用程序,它应该在之前再次请求该用户的许可让该用户登录。
如果您不明确退出用户,signIn()
调用和signInSilently()
调用都应该成功,而不显示任何类型的登录屏幕。
【讨论】:
很好的解释。它帮助我理解了这一点【参考方案2】:我不完全确定你在问什么。是否要检查用户是否已使用其 Google 帐户登录?
if (GIDSignIn.sharedInstance().hasAuthInKeychain())
// user is signed in
else
// show login
【讨论】:
不,我会避免每次都询问权限 @ale00 我不明白。您必须将用户踢出谷歌以获得他们登录的登录/许可时间。如果您想检测他们是否已经登录,请使用我的答案中的代码并且不要显示特定于登录的 UI。 我知道他们第一次使用我的应用程序时必须接受权限,但问题是每次我注销然后使用同一个帐户登录时,他们都会向我询问权限(屏幕在问题的顶部)@JAL @ale00 根据this answer,这是新SDK的默认行为。使用旧版本的登录 SDK,您以前可以使用GTMOAuth2SignIn
将 approval_prompt
设置为 auto
,但在新版本的 SDK 中似乎无法做到这一点。我看到的唯一其他选择是在新 SDK 中使用 GIDSignIn.sharedInstance().trySilentAuthentication()
。【参考方案3】:
您可以尝试以静默方式登录用户,但是您必须确定GIDAuthentication
属性是否已经可供您使用,例如 - idToken、accessToken ..等
那就直接叫吧
signIn.signInSilently()
假设signIn
是GIDSignIn
类型的参数
寻找 - (void) signInSilently in :- Google Docs
【讨论】:
【参考方案4】:Google 登录成功后,身份验证 firebase 用户为我工作,我使用了以下代码,
func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError?)
if error != nil
return
let authentication = user.authentication
let credential = FIRGoogleAuthProvider.credentialWithIDToken(authentication.idToken,
accessToken: authentication.accessToken)
FIRAuth.auth()?.signInWithCredential(credential) (user, error) in
【讨论】:
【参考方案5】:您可以通过这种方式解决问题:您必须在内部数据库中存储您的 currentID,当您打开应用程序时,您会得到 currentID,因此您会得到所有您的用户的信息。 我在 Facebook 登录时遇到了同样的问题,我解决了这个问题。 干得好
【讨论】:
【参考方案6】:根据 Firebase 官方文档,应该在 AppDelegate 中添加如下函数:
func application(application: UIApplication,
openURL url: NSURL, options: [String: AnyObject]) -> Bool
return GIDSignIn.sharedInstance().handleURL(url,
sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String,
annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
而且,如果你希望它在 iOS 8 及更低版本中工作,你应该添加你已经拥有的功能:
func application(application: UIApplication,
openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool
var options: [String: AnyObject] = [UIApplicationOpenURLOptionsSourceApplicationKey: sourceApplication,
UIApplicationOpenURLOptionsAnnotationKey: annotation]
return GIDSignIn.sharedInstance().handleURL(url,
sourceApplication: sourceApplication,
annotation: annotation)
您可以尝试添加这两个函数(如 Firebsae 建议的那样),看看这是否能解决错误。我不确定这是否会解决它,但至少是对 GID 功能的改进。
编辑:来源:https://firebase.google.com/docs/auth/ios/google-signin
【讨论】:
以上是关于Firebase Google SignIn 每次都会询问权限的主要内容,如果未能解决你的问题,请参考以下文章
Firebase团结认证google signIn,下载包删除Unity项目的UI。
如何使用 MVVM 架构实现 Firebase Google SignIn?
java.lang.IllegalArgumentException:服务未注册 Flutter 和 Firebase Google SignIn
在 Google SignIn 和 Firebase 中验证用户后,Flutter 将电子邮件用户参数传递到另一个页面
expo firebase google signin 给出:第一个参数“idToken”必须是有效字符串或有效对象或 null