Управление разрешениями входа через Facebook для браузера

Один из наиболее важных этапов запуска диалога входа — это выбор данных, к которым приложение должно иметь доступ. Во всех примерах использовался параметр scope, с помощью которого запрашивается доступ к данным человека. Такие права доступа называются разрешениями.

Они подробно описаны в нашем руководстве по разрешениям. При работе с разрешениями и диалогом входа необходимо помнить следующее:

  • Разрешения запрашиваются при создании диалога. Полученный набор разрешений связывается с возвращаемым маркером доступа.
  • Другие платформы могут использовать другие наборы разрешений. Например, в iOS можно запросить, какие места человек отметил, тогда как для веб-версии приложения это разрешение не требуется.
  • Вы можете добавить разрешения позже, когда понадобится расширить возможности. Если вам нужно новое разрешение, просто добавьте его в список к уже имеющимся и запросите его, заново вызвав диалог входа.
  • Диалог входа позволяет отказаться от предоставления разрешений, которые запрашивает приложение. Ваше приложение должно корректно работать в таких ситуациях. Подробнее см. в этом разделе.
  • Если приложение запрашивает дополнительную информацию, помимо полей по умолчанию, а также разрешение email, его необходимо отправить на проверку в Facebook. Подробнее см. в документации по проверке входа и в руководстве по проверке.

Добавление разрешений

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

Предположим, у вас есть кнопка "Вход" со следующими разрешениями:

<fb:login-button scope="public_profile" onlogin="checkLoginState();">
</fb:login-button>

Если вы проверите с помощью /me/permissions, какие разрешения вам предоставил пользователь, то увидите следующее:

{"data":
  [
    {
      "permission":"public_profile",
      "status":"granted"
    }
  ]
}

Если позднее вы захотите добавить разрешение email, перезапустите его, используя функцию FB.login():

FB.login(function(response) {
   console.log(response);
}, {scope: 'email'});

(Эту функцию необходимо вызвать из обработчика событий кнопки. В противном случае браузер может заблокировать всплывающее уведомление диалога.)

Обратите внимание, что в нем запрашивается только новое разрешение. Если новое разрешение принято, проверка /me/permissions даст следующий результат:

{"data":
  [
    {
      "permission":"public_profile",
      "status":"granted"
    },
    {
      "permission":"email",
      "status":"granted"
    }
  ]
}

Обратите внимание, что в список предоставленных разрешений добавлено новое разрешение email.

Повторный запрос отклоненных разрешений

Вход через Facebook позволяет людям отказаться от предоставления определенных разрешений. Если бы пользователь в этом примере снял флажок user_likes (отметки "Нравится"), результат проверки /me/permissions на предмет предоставленных разрешений был бы следующим:

{
  "data":
    [
      {
        "permission":"public_profile",
        "status":"granted"
      },
      {
        "permission":"user_likes",
        "status":"declined"
      }
    ]
}

Обратите внимание, что разрешение user_likes было не предоставлено, а отклонено.

Если вам отказали в предоставлении разрешений, их можно запросить повторно. Подготовьте экран с пояснением, зачем вам нужно это разрешение, и запросите его повторно. Однако если вы воспользуетесь методом, описанным в предыдущем разделе, диалог входа не будет запрашивать это разрешение.

Дело в том, что в случае отказа предоставить разрешение диалог входа не будет запрашивать его повторно, если только вы явным образом не настроите в нем повторный запрос отклоненного разрешения.

Добавьте в вызов FB.login() флажок auth_type: rerequest:

FB.login(
  function(response) {
    console.log(response);
  },
  {
    scope: 'user_likes',
    auth_type: 'rerequest'
  }
);

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