Как получить токен доступа страницы 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.
| Токен | От чьего имени | Срок жизни | Как получить |
|---|---|---|---|
| Короткоживущий пользовательский | Пользователь | Обычно 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 шагов
Настройте приложение
Добавьте Facebook Login в Meta App Dashboard и точно укажите redirect URI. В приложении типа Business (Facebook Login for Business) разрешения выбираются в конфигурации, а в ссылку входа передаётся
config_idвместоscope.Отправьте пользователя на вход
Добавьте в ссылку случайный
state(защита от CSRF) и сохраните его в сессии. Минимум —pages_show_list, остальное по задаче (для публикации —pages_manage_postsи т. д.).Обменяйте
codeна сервереВ callback сверьте
state, обменяйтеcodeна короткоживущий токен, затем черезfb_exchange_token— на долгоживущий. App secret живёт только на сервере — Meta и сама требует генерировать токен на серверной стороне.Получите токены страниц
Запросите
GET /me/accountsдолгоживущим токеном. Для каждой страницы придутid,name,access_tokenи задачи (tasks), доступные пользователю.Проверьте и сохраните в зашифрованном виде
В Access Token Debugger или через
debug_tokenпосмотритеexpires_at,data_access_expires_atиscopes. Храните токен зашифрованным, не отдавайте во фронтенд и не пишите в логи.
На Python: от входа до токена страницы
В SDK Socialift весь поток — четыре метода: login_url, exchange_code, granted_scopes, pages.
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.
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), а затем удалите токен из базы.