iOS Swift Facebook 身份验证与 Google Firebase - 如何获取额外权限?

Posted

技术标签:

【中文标题】iOS Swift Facebook 身份验证与 Google Firebase - 如何获取额外权限?【英文标题】:iOS Swift Facebook Authentication with Google Firebase - How to pull extra permissions? 【发布时间】:2016-09-02 17:06:58 【问题描述】:

我正在使用 Facebook SDK 4.15 和 Google Firebase 的最新版本来验证用户身份。我正在关注这里的文档:https://firebase.google.com/docs/auth/ios/facebook-login

这对我有用。

但是,我想从 Facebook 用户那里获取额外的权限,例如电子邮件。我已经像这样修改了代码:

@IBOutlet var facebookButton : FBSDKLoginButton!


override func viewDidLoad() 
/...
  facebookButton.readPermissions = ["email","public_profile"]
...

通过 Facebook 授权我的应用程序时,我会收到 Facebook 确认对话框,询问电子邮件权限。这样就行了。

但是,在我的回调中,用户的电子邮件地址始终为零:

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError?) 
  if let error = error 
    print(error.localizedDescription)
    return
  

  let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString)
  FIRAuth.auth()?.signInWithCredential(credential)  (user, error) in
    // ...  
    if let error = error 
      print(error.localizedDescription)
      return
   

    print("user.uid \(user!.uid)")
    print("user.photoURL \(user!.photoURL)")
    print("user.providerID \(user!.providerID)")
    print("user.email \(user!.email)")
    print("user.displayName \(user!.displayName)")

如何在使用 Google Firebase 身份验证时通过 Facebook 登录获取电子邮件等额外权限?

【问题讨论】:

我也有同样的问题。你解决了吗? 【参考方案1】:

使用第三方身份验证时,您会取回一个身份验证令牌,然后您可以使用该令牌将用户登录到您的应用中。使用此令牌,Firebase Auth 能够连同它一起提取用户的电子邮件地址。但是对于您的情况,如果您希望在 FB 登录后获取用户的电子邮件地址,则需要使用 Facebook 的 Graph API。您只需创建一个包含您要求的信息的 GraphRequest,如下所示。

斯威夫特 2

struct FacebookPermission

    static let ID: String = "id"
    static let NAME: String = "name"
    static let EMAIL: String = "email"
    static let PROFILE_PIC: String = "picture"
    static let LAST_NAME: String = "last_name"
    static let FIRST_NAME: String = "first_name"
    static let USER_FRIENDS: String = "user_friends"
    static let PUBLIC_PROFILE: String = "public_profile"


func getFacebookData()

    let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphpath: "me", parameters: ["fields" : "\(FacebookPermission.NAME), \(FacebookPermission.FIRST_NAME), \(FacebookPermission.LAST_NAME), \(FacebookPermission.EMAIL), \(FacebookPermission.PROFILE_PIC).type(large)"])

    graphRequest.startWithCompletionHandler  (connection: FBSDKGraphRequestConnection!, result:AnyObject!, error: NSError!) in

        if error == nil
        
            if let userName = result.valueForKey(FacebookPermission.NAME) as? String
            
                self.currentUser.userName = userName
            

            if let firstName = result.valueForKey(FacebookPermission.FIRST_NAME) as? String
            
                self.currentUser.firstName = firstName
            

            if let lastName = result.valueForKey(FacebookPermission.LAST_NAME) as? String
            
                self.currentUser.lastName = lastName
            

            if let email = result.valueForKey(FacebookPermission.EMAIL) as? String
            
                self.currentUser.email = email
            

            if let profilePic = result.valueForKey(FacebookPermission.PROFILE_PIC)
            
                let facebookImageURL = profilePic.valueForKey("data")?.valueForKey("url") as? String

                if let unwrappedURL = facebookImageURL
                
                    let imageData: NSData = NSData(contentsOfURL: NSURL(string: unwrappedURL)!)!
                    self.currentUser.profileImage = UIImage(data: imageData)!
                
            
        
        else
        
            print("Facebook Graph Request Error")
        
    

斯威夫特 3

func getFacebookData()

    let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "\(FacebookPermission.NAME), \(FacebookPermission.FIRST_NAME), \(FacebookPermission.LAST_NAME), \(FacebookPermission.EMAIL), \(FacebookPermission.PROFILE_PIC).type(large)"])

    graphRequest.start  (connection: FBSDKGraphRequestConnection?, result: Any?, error: Error?) in

        if error == nil
        
            if let facebookData = result as? NSDictionary
            
                if let userName = facebookData.value(forKey: FacebookPermission.NAME) as? String
                
                    self.currentUser.userName = userName
                

                if let firstName = facebookData.value(forKey: FacebookPermission.FIRST_NAME) as? String
                
                    self.currentUser.firstName = firstName
                

                if let lastName = facebookData.value(forKey: FacebookPermission.LAST_NAME) as? String
                
                    self.currentUser.lastName = lastName
                

                if let email = facebookData.value(forKey: FacebookPermission.EMAIL) as? String
                
                    self.currentUser.email = email
                

                if let profilePic = facebookData.value(forKey: FacebookPermission.PROFILE_PIC)
                
                    let facebookImageURL = ((profilePic as AnyObject).value(forKey: "data") as AnyObject).value(forKey: "url") as? String

                    if let unwrappedURL = facebookImageURL
                    
                        let imageData: Data = try! Data(contentsOf: URL(string: unwrappedURL)!)
                        self.currentUser.profileImage = UIImage(data: imageData)!
                    
                
            
        
        else
        
            print("Facebook Graph Request Error")
        
    

获取他们的信息后,您可以继续将其存储到您的 Firebase 数据库中。

Here's 有关 Facebook 权限的更多信息。 干杯伙伴!

【讨论】:

不适合我。 :((。你的代码在 Swift 3 中已经过时了。请更新 添加 Swift 3 等效 我的结果为零。 :( 您正在登录用户并请求权限,这需要用户已经登录才能访问。根据 FB,除非用户已经登录,否则除了 public_profile 之外的所有其他内容都无法访问。因此,在初始登录期间,您唯一可用的权限是 public_profile 并且只有在成功之后你能继续提出其他图表请求吗?请阅读我上面引用的 FB 权限链接,这是解决方案的 github link。 让我们continue this discussion in chat.【参考方案2】:

我找到this

Firebase 仅存储电子邮件+密码用户的列表。它不会为与社交提供商(例如 Facebook)签署的您的应用用户存储任何数据。

【讨论】:

以上是关于iOS Swift Facebook 身份验证与 Google Firebase - 如何获取额外权限?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Facebook SDK 在设备上进行身份验证后未重定向

如何使用带有 iOS SDK 的 Facebook 身份验证通过 DynamoDB 和 Cognito 存储用户信息

Facebook iOS SDK 和护照-facebook 身份验证

ios的phonegap中的facebook身份验证

Facebook 身份验证 iOS 使用 Storyboard

安装 Facebook 应用程序的身份验证失败 (iOS)