Оформление
Вход через Emotify
Кнопка «Войти через Emotify» для вашего сайта: человек входит своим аккаунтом, а ваш сайт узнаёт, кто он, — с его согласия.
Это стандартный OAuth 2.0 Authorization Code. Если вы уже делали «Войти через Google/GitHub» — здесь всё то же самое.
Что понадобится
- Приложение в Emotify (как создать).
- Подключённый OAuth: Настройки → Приложения → у приложения кнопка «Вход через Emotify». Укажите адрес возврата — страницу вашего сайта, куда Emotify вернёт человека после входа:
- только
https://(для локальной отладки годитсяhttp://localhost:…); - точный адрес без
*— напримерhttps://site.example.com/auth/callback.
- только
В ответ портал один раз покажет:
| Пример | ||
|---|---|---|
client_id | app-16c6e6b1-2b8d-… | публичный идентификатор клиента |
client_secret | Xk29fjA… | секрет — храните на сервере, показывается один раз |
Шаги входа
1. Отправьте человека на страницу входа
text
https://emotify.ru/auth/realms/RDS/protocol/openid-connect/auth
?client_id=app-16c6e6b1-2b8d-4665-ba47-3d197a4a6029
&response_type=code
&scope=openid%20emotify.identify
&redirect_uri=https%3A%2F%2Fsite.example.com%2Fauth%2Fcallback
&state=СЛУЧАЙНАЯ_СТРОКА| Параметр | Значение |
|---|---|
client_id | ваш client_id |
response_type | всегда code |
scope | что запрашиваете, через пробел — см. таблицу |
redirect_uri | адрес возврата, тот же, что указан при подключении |
state | случайная строка; сгенерируйте, сохраните в сессии |
Человек увидит страницу входа Emotify, а затем экран согласия с перечнем того, что вы запрашиваете.
2. Примите возврат
После «Разрешить» человек вернётся на ваш адрес:
text
https://site.example.com/auth/callback?code=КОД&state=ТА_ЖЕ_СТРОКАСверьте state с сохранённым. Не совпал — прервите вход: кто-то подсовывает чужой код.
3. Обменяйте код на токен
Серверный запрос (секрет не должен попадать в браузер):
bash
curl -X POST https://emotify.ru/auth/realms/RDS/protocol/openid-connect/token \
-d grant_type=authorization_code \
-d code=КОД_ИЗ_ВОЗВРАТА \
-d redirect_uri=https://site.example.com/auth/callback \
-d client_id=app-16c6e6b1-… \
-d client_secret=ВАШ_СЕКРЕТОтвет:
json
{
"access_token": "eyJhbGciOi…",
"expires_in": 300,
"refresh_token": "eyJhbGciOi…",
"token_type": "Bearer",
"scope": "openid emotify.identify"
}4. Узнайте, кто вошёл
bash
curl https://emotify.ru/api/v1/users/@me \
-H "Authorization: Bearer ACCESS_TOKEN"json
{
"id": "b3f4d17e-2293-4d3f-8465-523401ad894b",
"name": "KatrinKa 1",
"avatar": "412d5d2b-….jpg",
"avatarVersion": 10,
"scopes": ["openid", "emotify.identify"]
}id постоянен — привязывайте аккаунт вашего сайта к нему, а не к имени: имя человек может сменить.
Целиком на JavaScript (например, обработчик возврата в Express):
js
app.get('/auth/callback', async (req, res) => {
const { code, state } = req.query
if (state !== req.session.oauthState) return res.status(400).send('state не совпал')
const tokenRes = await fetch(
'https://emotify.ru/auth/realms/RDS/protocol/openid-connect/token',
{
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'authorization_code',
code,
redirect_uri: 'https://site.example.com/auth/callback',
client_id: process.env.EMOTIFY_CLIENT_ID,
client_secret: process.env.EMOTIFY_CLIENT_SECRET
})
}
)
const { access_token } = await tokenRes.json()
const user = await fetch('https://emotify.ru/api/v1/users/@me', {
headers: { Authorization: `Bearer ${access_token}` }
}).then((r) => r.json())
req.session.userId = user.id
res.redirect('/')
})Scope
| Scope | Открывает | Маршрут |
|---|---|---|
emotify.identify | id, имя, аватар (почты нет) | GET /users/@me |
emotify.channels.read | список каналов человека | GET /users/@me/channels |
Запрашивайте только нужное. Маршрут без своего scope отвечает 403 и называет недостающее:
json
{
"error": "Forbidden",
"status": "error",
"message": "Нужен scope emotify.identify: пользователь его не выдавал",
"requiredScope": "emotify.identify"
}Токен пользователя работает только на маршрутах /users/@me… — доступ к остальному Emotify он не даёт.
Обновление и отзыв
access_tokenкороткоживущий; продлевайте егоrefresh_token'ом (grant_type=refresh_token, тот же адрес обмена).- Секрет клиента можно перевыпустить в кабинете — старый перестаёт работать сразу.
- «Отозвать OAuth» в кабинете отключает вход для всех пользователей сразу.
- Человек может отозвать своё согласие сам — токены перестают действовать немедленно.