Как "перепроверить" разрешение электронной почты с помощью Facebook iOS SDK 4.x?

Я интегрирую интеграцию FacebookSDK 4.x с пользовательским интерфейсом и используя следующий метод для входа в систему, а также получение электронной почты от пользователя.

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: как указано в этой ссылке

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.

Включение повторной аутентификации

Во время выбранного вами потока входа мы показали вам, как использовать Вход Диалог и 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 reauthenticate:

FB.login(function (response) {     // Исходный код FB.login}, {auth_type: 'reauthenticate'})

Обратите внимание, что тело ответа содержит параметр auth_type вы указали, например:

access_token = USER_ACCESS_TOKEN & истекает = SECONDS_UNTIL_TOKEN_EXPIRES & auth_type = повторной аутентификации

Как передать "auth_type = rerequest" на серверы Facebook через SDK iOS? Есть ли специальный метод для этого?

Ответ 1

Я решил проблему, вызвав метод:

[login logInWithReadPermissions: @[@ "email" ] обработчик: ^ (FBSDKLoginManagerLoginResult * результат, ошибка NSError *)

Мне нужно передать auth_type: 'rerequest' при повторном запросе и получить его в документации по этому методу. Я получаю описание:

Используйте этот метод при запросе разрешений на чтение. Вы должны только спрашивать для разрешений, когда они необходимы, и объяснить значение для пользователь. Вы можете проверить результат. больше информации для пользователя, если они отклоняют разрешения.

Если [FBSDKAccessToken currentAccessToken] не равно нулю, это будет рассматривается как повторная авторизация для этого пользователя и флаг "requequest" в диалоговом окне входа в систему.

просто проблема заключалась в том, что я вызывал logout метод класса FbSDKLoginManager. Это очистит токен, и оно будет восприниматься как прежнее разрешение, не запрашиваемое повторно.

Ответ 2

Вам не нужно передавать или вызывать auth_type: rerequest. Это уже сделано в facebook. Если вы проверите FBSDKLoginManager, код сделает это за вас.

-(NSDictionary *)logInParametersWithPermissions:(NSSet *)permissions
{
    if ([FBSDKAccessToken currentAccessToken]) 
       {
             loginParams[@"auth_type"] = @"rerequest";
       }
}