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,您以前可以使用 GTMOAuth2SignInapproval_prompt 设置为 auto,但在新版本的 SDK 中似乎无法做到这一点。我看到的唯一其他选择是在新 SDK 中使用 GIDSignIn.sharedInstance().trySilentAuthentication()【参考方案3】:

您可以尝试以静默方式登录用户,但是您必须确定GIDAuthentication 属性是否已经可供您使用,例如 - idTokenaccessToken ..等

那就直接叫吧

signIn.signInSilently()

假设signInGIDSignIn类型的参数

寻找 - (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

通过 Firebase 登录 Google ->