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 身份验证