Ios Swift:将Facebook用户与不在解析服务器上工作的现有PFU用户链接

Ios Swift:将Facebook用户与不在解析服务器上工作的现有PFU用户链接,ios,swift,facebook,parse-platform,parse-server,Ios,Swift,Facebook,Parse Platform,Parse Server,我正在尝试将Facebook登录/注册集成到我的应用程序中,与标准的电子邮件登录/注册一起工作。我正在使用Swift,并已迁移到解析服务器 我遵循了Facebook用户的解析iOS指南。然而,根据所有的教程和文档,使用Parse Server,Facebook集成无法正常工作 在应用程序中使用Facebook登录时,如何将现有PFU用户与其Facebook帐户链接? 我正在使用指南()本节中的Swift代码将现有PFUser与Facebook帐户关联(请参见下面的代码),但是,由于未知原因,此代

我正在尝试将Facebook登录/注册集成到我的应用程序中,与标准的电子邮件登录/注册一起工作。我正在使用Swift,并已迁移到解析服务器

我遵循了Facebook用户的解析iOS指南。然而,根据所有的教程和文档,使用Parse Server,Facebook集成无法正常工作

在应用程序中使用Facebook登录时,如何将现有PFU用户与其Facebook帐户链接?

我正在使用指南()本节中的Swift代码将现有PFUser与Facebook帐户关联(请参见下面的代码),但是,由于未知原因,此代码未执行,因此未将用户通过电子邮件注册创建的现有帐户与其具有相同电子邮件的Facebook帐户关联为什么此代码不执行?

更新:方法要求用户登录。但是,当用户注销/刚下载应用程序时,PFUser.currentUser()为零,因为该用户未登录。因此,
linkUserInBackground
方法将不知道将Facebook帐户链接到哪个
PFUser
。我相信这些方法现在是无用的,因为它们是在事实发生后(登录后)链接的。但我不想创建两个用户。 是否有云代码示例或其他Swift逻辑来实现这一点

我不确定是什么问题。谢谢你的帮助

资料来源:


您是否在Swift应用程序中正确配置了FBSDK?您应该需要在处理FBSDK()的应用程序委托中添加一些回调


另外,该应用程序是在parse.com上运行的,还是您第一次在parse服务器上使用它?

您是否在Swift应用程序中正确配置了FBSDK?您应该需要在处理FBSDK()的应用程序委托中添加一些回调


另外,该应用程序是在parse.com上运行的,还是您第一次在parse服务器上使用它?

是的,我确实正确配置了FBSDK。应用程序正在解析服务器上运行。在我的问题更新中,我提到,
isLinkedWithUser
方法要求用户登录。因此,
linkUserInBackground
方法将不知道将Facebook帐户链接到哪个PFUser。然而,我试图在Facebook登录期间将Facebook用户链接到现有的PFUser,这样就不会有重复的用户(使用相同的电子邮件)。不确定Parse为什么没有考虑到这一点……电子邮件的问题是,依靠这些邮件将用户链接在一起是不安全的。为了确保电子邮件属于某个人,需要输入密码。你能做的是,1。从Facebook 2获取访问令牌。从FBSDK 3获取电子邮件。将其发送到云代码功能,获取所有用户的电子邮件" 4. 如果该用户存在,请在云代码中进行链接,并将结果发送回客户端,或者在用户通过电子邮件/密码登录后发送回客户端。我们没有实现它,因为它是特定于您的应用程序库的问题。1) 你指的是从Facebook获得访问令牌和电子邮件吗?在我的登录中使用Facebook方法?2) 什么类型的云代码功能?我以前从未使用过云代码,但我的想法是使用beforeSave函数,因为这样在保存重复用户之前,我可以链接用户。同时,我不确定我是否能够链接,因为用户还不存在,因为它位于beforeSave中。3) 如果我们只在逻辑中使用电子邮件,为什么我们也需要发送访问令牌?4)“在客户端,在用户通过电子邮件/密码登录后”:主要的一点是用户避免输入他们的电子邮件/密码,然后链接。我知道这是可以做到的。但是如果用户点击Facebook登录按钮进行登录/注册怎么办?1)我提到过通过客户端Facebook SDK获取电子邮件(请参阅Facebook SDK文档)2)这取决于您的决定,在保存为时已晚之前,这也可以成为REST端点。3) 访问令牌用于根据Facebook记录验证用户的身份。任何来自客户的东西都是不可信的。即使是有效的访问令牌也可能被攻击者与目标的电子邮件耦合。4) 确保电子邮件属于用户的唯一方法是将其与密码匹配…是的,我确实正确配置了FBSDK。应用程序正在解析服务器上运行。在我的问题更新中,我提到,
isLinkedWithUser
方法要求用户登录。因此,
linkUserInBackground
方法将不知道将Facebook帐户链接到哪个PFUser。然而,我试图在Facebook登录期间将Facebook用户链接到现有的PFUser,这样就不会有重复的用户(使用相同的电子邮件)。不确定Parse为什么没有考虑到这一点……电子邮件的问题是,依靠这些邮件将用户链接在一起是不安全的。为了确保电子邮件属于某个人,需要输入密码。你能做的是,1。从Facebook 2获取访问令牌。从FBSDK 3获取电子邮件。将其发送到云代码功能,获取所有用户的电子邮件" 4. 如果该用户存在,请在云代码中进行链接,并将结果发送回客户端,或者在用户通过电子邮件/密码登录后发送回客户端。我们没有实现它,因为它是特定于您的应用程序库的问题。1) 你指的是从Facebook获得访问令牌和电子邮件吗?在我的登录中使用Facebook方法?2) 什么类型的云代码功能?我以前从未使用过云代码,但我的想法是使用beforeSave函数,因为这样在保存重复用户之前,我可以链接用户。同时,我不确定我是否能够链接,因为用户还不存在,因为它是
func fbLoginButtonTapped() {
    print("fbLoginButtonTapped")

    let permissions = ["public_profile", "email"]
    PFFacebookUtils.logInInBackgroundWithReadPermissions(permissions, block: {
        (user: PFUser?, error: NSError?) -> Void in

        if let user = user {
            if user.isNew {
                print("User signed up and logged in through Facebook!")
            } else {
                print("User logged in through Facebook!")

                // This API doesn't seem to be working with Parse Server
                if !PFFacebookUtils.isLinkedWithUser(user) {
                    PFFacebookUtils.linkUserInBackground(user, withReadPermissions: nil, block: {
                        (succeeded: Bool?, error: NSError?) -> Void in
                        if error == nil {
                            print("Woohoo, the user is linked with Facebook!")
                        } else {
                            print("User is not linked with Facebook.")
                        }
                    })
                }


                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("HomeNavigationController") as! UINavigationController
                    self.presentViewController(viewController, animated: true, completion: nil)
                })

            }
        } else {
            print("User cancelled the Facebook login.")
        }           

}