将 Facebook 登录与 Parse 集成

Posted

技术标签:

【中文标题】将 Facebook 登录与 Parse 集成【英文标题】:Integrate Facebook Login with Parse 【发布时间】:2017-08-10 22:41:50 【问题描述】:

在我的 Xcode 项目中,我已经有了一个使用他们创建的用户用户名和密码的登录功能。现在我想在项目中集成一个 Facebook 登录。我能够用 Facebook 编写简单的注册,它将项目连接到他们的 Facebook。在这一步之后,我被两个问题难住了:

    要通过 Facebook 注册用户,我需要保存某种形式的唯一标识,以便他们在登录时可以再次使用它。但我不知道这个标识是什么或从哪里得到的。

    我只知道如何通过我在解析中保存的用户名和密码登录用户以访问他们的个人资料。这如何与 Facebook 配合使用?

谁能帮我解决这两个问题?

我已经复制了我的 Facebook 登录代码:

 @IBOutlet var facebookSignUpButton: FBSDKLoginButton!
    var fullnameFB = String()
    var emailFB = String()
    var isFBSignUp = Bool()

    override func viewDidLoad() 
            super.viewDidLoad()

            signUpWithFacebook()
        

        //
        // Facebook Sign Up Functions =>
        //
        func signUpWithFacebook() 
            facebookSignUpButton.readPermissions = ["email", "public_profile"]
            facebookSignUpButton.delegate = self
            self.view.addSubview(facebookSignUpButton)

        
        //what to do when logged in
        func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) 
            if error != nil  //if theres an error
                print(error)
             else if result.isCancelled  // if user cancels the sign up request
                print("user cancelled login")
             else 
                if result.grantedPermissions.contains("email") 
                    if let graphRequest = FBSDKGraphRequest(graphpath: "me", parameters: ["fields": "email, name"]) 
                        graphRequest.start(completionHandler:  (connection, result, error) in
                            if error != nil 
                                print(error?.localizedDescription ?? String())
                             else 
                                if let userDetails = result as? [String: String]
                                    print(userDetails)
                                    self.fullnameFB = userDetails["name"]!                                       
                                    self.emailFB = userDetails["email"]!
                                    self.isFBSignUp = true                                
                                
                                self.performSegue(withIdentifier: "SignUpP2VC", sender: nil)
                            
                        )
                    
                 else 
                    print("didnt get email")
                    createAlert(title: "Facebook Sign Up", message: "To signup with Facebook, we need your email address")                
                
            
        
        //logout function
        func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) 
            print("logged out")
        

【问题讨论】:

【参考方案1】:

如果您使用 Parse,则有一个名为 PFFacebookUtils 的帮助程序库来处理用户链接

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) 
    if error != nil  //if theres an error
        print(error)
     else if result.isCancelled  // if user cancels the sign up request
        print("user cancelled login")
     else 
        // TODO: guard against nil => result?.token
        PFFacebookUtils.logInInBackground(with: result!.token!)  (user, error) in

            if let user = user 

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

                // Get user email using FBSDKGraphRequest
             else 
                    print("Error while trying to login using Facebook: \(error?.localizedDescription ?? "---")")
            
        
    

【讨论】:

我应该从他们的 Facebook 个人资料中保存哪个/什么唯一标识,这样我就知道在他们使用 Facebook 登录时应该设置哪个帐户。截至目前,人们输入他们的用户名和密码登录并基于用户名我可以调出他们的个人资料。但如果他们使用 Facebook 登录,我将没有初始用户名。 我应该保存什么? 配置文件是指 Parse 中的用户?使用PFFacebookUtils.logInInBackground 后,如有必要,库将在用户表中创建一个新行。从那里您可以访问所有用户的详细信息。如果您确实需要用户名,可以向用户询问昵称。 PFFacebookUtils.logInInBackground 返回的用户变量是PFUser?。您不需要用户名,但如果您的应用需要,则需要输入昵称(用户名由 Parse 在使用 3rd 方身份验证服务时自动生成)。 我尝试实现PFFacebookUtils,但收到错误“使用未解析的标识符'PFFacebookUtils'”。在这个视图控制器中,我导入了 FBSDKCoreKit 和 FBSDKLoginKit。我还缺少什么? 您没有正确集成库。按照github.com/parse-community/… 中描述的步骤操作

以上是关于将 Facebook 登录与 Parse 集成的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Facebook + Swift + Parse 获取封面照片

将 Spring Security 与 Facebook 登录集成

将 Parse 与 FB 集成连接起来

在 Swift 中使用 Parse 使用 FB 登录的用户持久性

无法使用 Swift 在 Xcode 中使用 Parse 1.7.2 和 Facebook SDK 4.1 创建新用户

Facebook(4.6)/Parse(1.9.1) 登录无效