Перейти к содержимому
Socialift
Руководство

Как получить токен доступа страницы Facebook

Чтобы получить токен страницы Facebook, пользователь проходит Facebook Login и выдаёт pages_show_list и нужные разрешения pages_*, вы на сервере меняете короткоживущий пользовательский токен на долгоживущий (около 60 дней) и запрашиваете /me/accounts — там токен каждой страницы. У Page-токена, полученного из долгоживущего токена, нет даты истечения, но его могут отозвать.

Обновлено:

Коротко: как получить Page access token

Токен страницы не выдаётся напрямую — он получается из пользовательского токена. Цепочка: Facebook Login → code → короткоживущий пользовательский токен → обмен на сервере через fb_exchange_token на долгоживущий → GET /me/accounts. У каждой страницы в ответе есть access_token. Если /me/accounts вызван с долгоживущим токеном, у токена страницы не будет даты истечения.

Самая частая ошибка — запрашивать список страниц короткоживущим токеном. Тогда и токен страницы живёт несколько часов, и интеграция «сама» отваливается на следующий день.

Вторая ошибка — считать «бессрочный» вечным. Meta прямо пишет, что такие токены истекают или аннулируются только при определённых условиях. Значит, код должен ожидать ошибку токена и уметь переподключать аккаунт.

Типы токенов Meta и срок их жизни

Какой токен от чьего имени работает и сколько живёт — по документации Meta.

Типы токенов Meta и срок их жизни — Таблица возможностей по платформам
ТокенОт чьего имениСрок жизниКак получить
Короткоживущий пользовательскийПользовательОбычно 1–2 часаОбмен code после Facebook Login
Долгоживущий пользовательскийПользовательОколо 60 днейНа сервере: grant_type=fb_exchange_token
Токен страницы (из короткого)СтраницаЧасы/me/accounts с коротким токеном
Токен страницы (из долгоживущего)СтраницаБез даты истечения, но может быть отозван/me/accounts с долгоживущим токеном
Токен system userБизнес-портфолио (Business Manager)Бессрочный или 60 дней (set_token_expires_in_60_days=true)Business Settings или POST /{system-user-id}/access_tokens
Токен приложенияПриложениеДля настроек приложения и служебных вызововНа сервере через app secret, например для debug_token

Meta предупреждает: сроки могут измениться без уведомления, а токен — истечь раньше. Полагайтесь на ошибку API, а не на дату.

Как получить бессрочный токен страницы: 5 шагов

  1. Настройте приложение

    Добавьте Facebook Login в Meta App Dashboard и точно укажите redirect URI. В приложении типа Business (Facebook Login for Business) разрешения выбираются в конфигурации, а в ссылку входа передаётся config_id вместо scope.

  2. Отправьте пользователя на вход

    Добавьте в ссылку случайный state (защита от CSRF) и сохраните его в сессии. Минимум — pages_show_list, остальное по задаче (для публикации — pages_manage_posts и т. д.).

  3. Обменяйте code на сервере

    В callback сверьте state, обменяйте code на короткоживущий токен, затем через fb_exchange_token — на долгоживущий. App secret живёт только на сервере — Meta и сама требует генерировать токен на серверной стороне.

  4. Получите токены страниц

    Запросите GET /me/accounts долгоживущим токеном. Для каждой страницы придут id, name, access_token и задачи (tasks), доступные пользователю.

  5. Проверьте и сохраните в зашифрованном виде

    В Access Token Debugger или через debug_token посмотрите expires_at, data_access_expires_at и scopes. Храните токен зашифрованным, не отдавайте во фронтенд и не пишите в логи.

На Python: от входа до токена страницы

В SDK Socialift весь поток — четыре метода: login_url, exchange_code, granted_scopes, pages.

facebook_pages.py
import secrets
from socialift import Facebook

REDIRECT = "https://example.com/facebook/callback"
SCOPES = ["pages_show_list", "pages_read_engagement", "pages_manage_posts"]

def login_link(fb: Facebook) -> tuple[str, str]:
    state = secrets.token_urlsafe(32)  # сохраните в сессии
    return fb.login_url(redirect_uri=REDIRECT, state=state, scopes=SCOPES), state

async def on_callback(code: str) -> None:
    async with Facebook.from_env() as fb:
        user = await fb.exchange_code(code, redirect_uri=REDIRECT)  # ~60 дней
        granted = await fb.granted_scopes(user.access_token)
        missing = set(SCOPES) - set(granted)
        if missing:
            raise RuntimeError(f"Отклонённые разрешения: {missing}")
        for page in await fb.pages(user.access_token):
            save_page(page.id, page.name, page.access_token)  # зашифровать

exchange_code делает два запроса: code → короткий токен → долгоживущий. redirect_uri должен посимвольно совпадать с тем, что был в ссылке входа.

granted_scopes читает реально выданные разрешения через debug_token: пользователь может снять часть галочек в диалоге.

В приложении типа Business вместо scopes передаётся config_id. save_page — ваша функция хранения: SDK ничего не сохраняет.

Какие разрешения нужны для работы со страницей

Зависимости из Permissions Reference: запрашивая разрешение, запрашивайте и его зависимости.

Какие разрешения нужны для работы со страницей — Таблица возможностей по платформам
РазрешениеЧто даётЗависит от
pages_show_listСписок страниц, которыми управляет пользовательнет
pages_read_engagementПосты, фото и видео страницы, данные подписчиков, метаданныеpages_show_list
pages_manage_postsСоздание, редактирование и удаление постовpages_read_engagement, pages_show_list
pages_read_user_contentПосты, комментарии и оценки пользователей на страницеpages_show_list
pages_manage_engagementСоздание, редактирование и удаление комментариевpages_read_user_content, pages_show_list
pages_manage_metadataПодписка на вебхуки и настройки страницыpages_show_list
read_insightsСтатистика страницыpages_read_engagement, pages_show_list

естьнет

Со Standard Access эти разрешения могут выдать только люди с ролью в приложении. Для чужих страниц нужен Advanced Access — через App Review и Business Verification.

Разрешения есть, а пост не публикуется: задачи на странице

Токен ограничен не только разрешениями, но и задачами (tasks) пользователя на странице. По документации Pages API: CREATE_CONTENT — публикация от имени страницы, MODERATE — ответы на комментарии и их удаление, ANALYZE — статистика, ADVERTISE — реклама, MESSAGING — отправка сообщений, MANAGE — назначение задач.

Практическое правило: при подключении сохраняйте tasks из ответа /me/accounts и показывайте их в интерфейсе. Если страницу подключил сотрудник только с ANALYZE, статистика будет работать, а публикация — нет, и это не баг в коде.

Почему токен страницы перестаёт работать

Graph API различает проблемы с токеном по error_subcode. Самые частые:

Почему токен страницы перестаёт работать — Таблица возможностей по платформам
СубкодПричинаЧто делать
460Пользователь сменил парольПопросить войти заново и получить новые токены
463Срок токена истёк или он отозванПовторный вход; старый токен удалить
467Недействительный токен (отозван, истёк)Повторный вход
458Пользователь удалил приложениеПометить подключение как разорванное
492У владельца токена нет нужной роли на страницеЗапросить роль у админа или подключить через другого админа

Основной код обычно 190. В SDK Socialift код 190 превращается в AuthError — ловите его и переводите аккаунт в состояние «нужно переподключить».

Истечение доступа к данным (90 дней) — отдельный механизм

Помимо срока токена, у Meta есть срок доступа к данным: если пользователь не был активен последние 90 дней, войти он сможет, но приложение теряет доступ к его данным. Это не связано со сроком жизни токена.

На сервере дату видно в поле data_access_expires_at ответа debug_token. Для восстановления у пользователя повторно запрашивают разрешения (auth_type=reauthorize).

Токен system user: серверная интеграция без человека

System user — программный «пользователь» бизнес-портфолио. Его токен не зависит от пароля или сессии сотрудника, поэтому подходит для автоматической работы со страницами и рекламными кабинетами своей компании.

Бывает два типа: admin system user (создаёт других system users и раздаёт права — Meta советует не использовать его для работы с активами) и обычный system user (доступ только к выданным активам). Со Standard Access можно создать 1 обычного и 1 админа, с Advanced Access — 10 обычных и 1 админа.

Токен создаётся в Business Settings или через API (POST /{system-user-id}/access_tokens). Приложение должно принадлежать тому же бизнесу, а запрашиваемые разрешения — пройти App Review. Токен бывает бессрочным или 60-дневным (set_token_expires_in_60_days=true); Meta рекомендует для интеграций истекающие токены, их продлевают через fb_exchange_token. Отзыв — /oauth/revoke.

Что выбрать: SaaS для чужих страниц — Facebook Login (в Facebook Login for Business есть и токен Business Integration System User, по умолчанию бессрочный). Только активы своей компании — system user.

Отключение: как правильно отозвать токен

Удалить токен из базы недостаточно — разрешение останется на стороне Facebook.

disconnect.py
from socialift import AuthError, Facebook

async def disconnect(user_token: str, account_id: int) -> None:
    async with Facebook.from_env() as fb:
        print("Выданные разрешения:", await fb.granted_scopes(user_token))
        try:
            await fb.revoke(user_token)  # DELETE /me/permissions
        except AuthError:
            pass  # токен уже недействителен — связи на стороне Meta нет
    delete_tokens(account_id)  # удалите пользовательский и Page-токены

При отзыве всех разрешений пользовательские токены становятся недействительными, а при следующем подключении пользователь выдаёт разрешения заново.

Для ручной проверки Access Token Debugger (developers.facebook.com/tools/debug/accesstoken) показывает владельца, срок и разрешения токена.

Чек-лист для продакшена

  • Получайте токен страницы только из долгоживущего пользовательского токена.
  • Проверяйте granted_scopes и показывайте отклонённые разрешения в интерфейсе.
  • Храните токены зашифрованными; не отдавайте во фронтенд, логи и отчёты об ошибках.
  • К каждому запросу добавляется appsecret_proof (SDK делает это автоматически).
  • При ошибке 190 переводите аккаунт в «нужно переподключить» и уведомляйте владельца.
  • При отключении вызывайте revoke и удаляйте токены из базы.

← Назад в блог

Частые вопросы

Существует ли бессрочный токен страницы Facebook?

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

Почему токен страницы истекает через час-два?

Вы получили его короткоживущим пользовательским токеном. Сначала обменяйте пользовательский токен на долгоживущий через fb_exchange_token на сервере, затем снова вызовите /me/accounts.

Подойдёт ли токен из Graph API Explorer для продакшена?

Explorer — инструмент для тестов. В продакшене токен получают через OAuth на сервере: app secret не должен попадать в браузер, а у каждого клиента свой токен.

Чем токен system user отличается от токена страницы?

Токен страницы получен из разрешения человека, который управляет страницей, и перестаёт работать, если человек теряет роль. Токен system user принадлежит бизнес-портфолио, не привязан к сотруднику и предназначен для автоматической работы с активами своей компании.

Если удалить токен из базы, доступ отзовётся?

Нет. Разрешение останется на стороне Facebook. Вызовите DELETE /{user-id}/permissions (в SDK — fb.revoke), а затем удалите токен из базы.

Источники

  1. Meta: Access Token Guide
  2. Meta: Long-Lived Access Tokens
  3. Meta: System user tokens
  4. Meta: Permissions Reference
  5. Meta: Graph API error handling
  6. Meta: Authentication vs Data Access

Связанные страницы