【问题标题】:Swift: Linking Facebook users with existing PFUsers Not Working on Parse ServerSwift:将 Facebook 用户与不在 Parse Server 上工作的现有 PFUser 联系起来
【发布时间】:2016-07-11 23:58:24
【问题描述】:

我正在尝试将 Facebook 登录/注册集成到我的应用程序中,以便与标准的电子邮件登录/注册一起使用。我正在使用 Swift 并已迁移到 Parse Server。

我已按照 Facebook 用户上的 Parse iOS 指南进行操作。但是,根据那里的所有教程和文档,使用 Parse Server,Facebook 集成无法正常工作。

当现有的 PFUser 在应用中使用 Facebook 登录时,如何将他们与其 Facebook 帐户关联?

我正在使用本指南 (https://parse.com/docs/ios/guide#users-linking) 中的 Swift 代码将现有 PFUser 关联到 Facebook 帐户(请参见下面的代码),但是,由于某些未知原因,此代码未执行,因此未执行将他们通过电子邮件创建的用户现有帐户与具有相同电子邮件的 Facebook 帐户注册。 为什么这段代码没有执行?

更新isLinkedWithUser 方法要求用户登录。但是,当用户退出/刚刚下载应用程序时,PFUser.currentUser() 为 nil,因为用户未登录。因此,linkUserInBackground 方法将不知道将 Facebook 帐户链接到哪个PFUser。我相信这些方法现在没用了,因为它们是事后链接(在他们登录之后)。但我不想创建两个用户。 是否有 Cloud Code 示例或其他 Swift 逻辑来完成此操作?

我不确定问题是什么。感谢任何帮助!

来源:https://parse.com/docs/ios/guide#users-facebook-users

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.")
        }           

}

【问题讨论】:

  • 这个问题你解决了吗?如果是这样,您能否更新您的问题?

标签: ios swift facebook parse-platform parse-server


【解决方案1】:

您是否在 Swift 应用中正确配置了 FBSDK?您应该需要在处理 FBSDK (https://developers.facebook.com/docs/ios/getting-started/) 的应用委托中添加一些回调。

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

【讨论】:

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