Долгосрочные маркеры доступа

Маркеры пользователя и маркеры доступа к Странице, предоставляемые по умолчанию, являются краткосрочными и действуют несколько часов. Однако такой маркер можно обменять на долгосрочный.

SDK для iOS, Android и JavaScript автоматически обновляют маркеры, если пользователь открывал приложение в течение последних 90 дней. Нативным мобильным приложениям, которые используют SDK от Facebook, предоставляются долгосрочные маркеры доступа пользователя, действующие около 60 дней. Эти маркеры обновляются один раз в день, когда пользователь приложения отправляет запрос на серверы Facebook. При отсутствии запросов срок действия маркера истечет приблизительно через 60 дней, и для получения нового маркера пользователю придется вновь выполнить вход.

Последняя версия API Graph: v21.0

Получение долгосрочного маркера доступа пользователя

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

Вам понадобится следующее:

  • действительный маркер доступа пользователя;
  • ID вашего приложения;
  • секрет вашего приложения.

Отправьте запрос к конечной точке GET oauth/access_token.

curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/access_token?  
    grant_type=fb_exchange_token&          
    client_id={app-id}&
    client_secret={app-secret}&
    fb_exchange_token={your-access-token}" 

Пример ответа

{
  "access_token":"{long-lived-user-access-token}",
  "token_type": "bearer",
  "expires_in": 5183944            //The number of seconds until the token expires
}

Процесс получения долгосрочного маркера доступа пользователя выглядит так:

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

Оговорки

  • Нельзя запрашивать долгосрочный маркер с использованием маркера, срок действия которого истек. Если срок действия маркера истек, ваше приложение должно предложить пользователю войти заново, чтобы повторно сгенерировать новый краткосрочный маркер доступа.

  • Вызов необходимо отправлять с сервера, а не из клиента. Этот вызов API содержит секрет приложения, поэтому запрос ни в коем случае не следует отправлять из клиента. Вместо этого реализуйте на сервере код создания запроса и передайте ответ, содержащий долгосрочный маркер, в код клиента. Эта строка будет отличаться от исходного маркера, поэтому, если вы сохраняете маркеры, замените старый.

  • Не используйте одни и те же долгосрочные маркеры для двух и более веб-клиентов (например, если человек входит в приложение с нескольких компьютеров). Вместо этого с помощью долгосрочных маркеров нужно сгенерировать на сервере код, который позволит получить долгосрочный маркер в клиенте. Далее будет описано, как создать долгосрочные маркеры из долгосрочных маркеров на сервере.

Получение долгосрочного маркера доступа к Странице

Долгосрочный маркер доступа к Странице можно сгенерировать из долгосрочного маркера доступа пользователя. Такие маркеры доступа к Странице имеют неограниченный срок действия. Срок действия истекает или маркер становится недействительным только при определенных условиях.

Вам понадобится:

Отправьте запрос к конечной точке GET {app-scoped-user-id}?accounts.

curl -i -X GET "https://graph.facebook.com/{graph-api-version}/{app-scoped-user-id}/accounts?
  access_token={long-lived-user-access-token}"

Пример ответа

{
  "data":[
    {
      "access_token":"{long-lived-page-access-token}",
      "category":"Brand",
      "category_list":[
        {
          "id":"1605186416478696",
          "name":"Brand"
        }
      ],
      "name":"Cute Kitten Page",
      "id":"{page-id}",
      "tasks":[
        "ANALYZE",
        "ADVERTISE",
        "MODERATE",
        "CREATE_CONTENT",
        "MANAGE"
      ]
    }
  ],
  "paging":{
    "cursors":{
      "before":"MTM1MzI2OTg2NDcyODg3OQZDZD",
      "after":"MTM1MzI2OTg2NDcyODg3OQZDZD"
    }
  }
}

Получение долгосрочных маркеров для клиентов

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

  • имеют собственную систему аутентификации (например, используют имя пользователя и пароль);
  • сохраняют на своих серверах маркер доступа Facebook для соответствующего пользователя и передают его различным клиентам (браузеру или нативным мобильным приложениям);
  • отправляют вызовы API из всех этих клиентов.

На высоком уровне долгосрочный маркер можно получить для клиента следующим образом:

  1. Ваш сервер отправляет запрос на получение кода от Facebook с помощью действительного долгосрочного маркера доступа.
  2. Facebook отправляет код на ваш сервер, который передает его клиенту по защищенному соединению.
  3. Клиент запрашивает с помощью этого кода долгосрочный маркер у Facebook.
  4. Facebook отправляет долгосрочный маркер, который клиент может использовать для публикации историй или запроса данных.

Получение кода

Отправьте запрос к конечной точке GET oauth/client_code. URI перенаправления должен совпадать с указанным на Панели приложений в карточке Вход через Facebook > Настройки > Клиентские настройки OAuth.

curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/client_code?             
    client_id={app-id}&
    client_secret={app-secret}&
    redirect_uri={app-redirect-uri}&
    access_token={long-lived-user-access-token}" 

Пример ответа

{
  "code":"{code-for-your-client}"
}

Отправка кода для получения долгосрочного маркера доступа

Код, полученный от сервера Facebook, необходимо передать клиенту по защищенному каналу. После этого нужно отправить запрос от клиента к конечной точке /oauth/access_token:

curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/access_token?   
    code={code-for-your-client}&
    client_id={app-id}&
    redirect_uri={app-redirect-uri}&
    machine_id= {your-client-machine-id}"

machine_id — это необязательный параметр, который идентифицирует и отслеживает клиентов и применяется для обеспечения безопасности и предотвращения спама. Его значение индивидуально для каждого клиента, но не для каждого пользователя. Если вы уже отправляли вызовы для получения кода и вам был предоставлен machine_id, укажите его в запросе кода.

Пример ответа

{
  "access_token":"{long-lived-access-token}", 
  "expires_in":5183944,           //The number of seconds until the token expires
  "machine_id":"{your-client-machine-id}"
}

Процесс получения долгосрочного маркера выглядит так: