我正在整合FacebookSDK 4.x与自定义UI的集成,并使用以下方法登录并获取用户的电子邮件权限。
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if (error){
NSLog(@"%@",[error localizedDescription]);
}
else if (result.isCancelled){
NSLog(@"Cancled");
}
else
{
if ([result.grantedPermissions containsObject:@"email"])
{
NSLog(@"Granted all permission");
if ([FBSDKAccessToken currentAccessToken])
{
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
{
if (!error)
{
NSLog(@"%@",result);
}
}];
}
}
else
{
NSLog(@"Not granted");
}
}
}];
除非用户拒绝访问“电子邮件”,否则此功能非常有用。我在FacebookSDK文档中看到,我可以重新请求访问用户的电子邮件一次。根据FB文档:在link
中给出If someone has declined a permission for your app, the login dialog won't let your app re-request the permission unless you pass auth_type=rerequest along with your request.
启用重新验证
在您选择的登录流程中,我们向您展示了如何使用登录 Dialog和OAuth用于对某人进行身份验证并从中请求权限 他们。要重新进行身份验证,您可以使用其他相同的步骤 强制它的参数:
auth_type:此参数指定请求的身份验证 功能(以逗号分隔的列表)。有效选项包括: https - 检查是否存在安全的Facebook会话,如果不存在则要求重新进行身份验证 reauthenticate - 要求此人无条件重新认证
auth_nonce: includes an app generated alphanumeric nonce which can be used to provide replay protection. See how to check an auth_nonce
了解更多。
以下是使用触发的JavaScript SDK的示例 使用auth_type of reauthenticate重新验证:
FB.login(function(response){ //原始FB.login代码},{auth_type:'reauthenticate'})
请注意,响应正文包含auth_type参数 你指定了,例如:
=的access_token&USER_ACCESS_TOKEN放大器;期满= SECONDS_UNTIL_TOKEN_EXPIRES&安培; AUTH_TYPE =重新验证
如何通过iOS SDK将“auth_type = rerequest”传递给Facebook的服务器?有没有特别的方法呢?
答案 0 :(得分:15)
我通过回忆方法解决了问题:
[登录logInWithReadPermissions:@ [@" email"] handler:^(FBSDKLoginManagerLoginResult * result,NSError * error)
我需要在再次请求时传递 auth_type:' rerequest' ,然后我会在此方法的文档中获取说明:
请求读取权限时使用此方法。你应该只问 在需要时获取权限并向其解释值 用户。您可以检查result.declinedPermissions以提供 如果用户拒绝权限,则会向用户提供更多信息。
如果
[FBSDKAccessToken currentAccessToken]
不是零,那就是 作为该用户的重新授权处理并将通过 "再请求"登录登录对话框。
问题是我正在调用 logout FbSDKLoginManager类的方法。这将清除令牌,它将把它作为旧权限而不是重新请求的权限。
答案 1 :(得分:2)
您实际上不需要传递或调用auth_type:rerequest。这已经由facebook完成了。如果您检查FBSDKLoginManager,代码会为您完成。
-(NSDictionary *)logInParametersWithPermissions:(NSSet *)permissions
{
if ([FBSDKAccessToken currentAccessToken])
{
loginParams[@"auth_type"] = @"rerequest";
}
}