Skip to content

Вход через Emotify ​

Кнопка «Войти через Emotify» для вашего сайта: человек входит своим аккаунтом, а ваш сайт узнаёт, кто он, — с его согласия.

Это стандартный OAuth 2.0 Authorization Code. Если вы уже делали «Войти через Google/GitHub» — здесь всё то же самое.

Что понадобится ​

  1. Приложение в Emotify (как создать).
  2. Подключённый OAuth: Настройки → Приложения → у приложения кнопка «Вход через Emotify». Укажите адрес возврата — страницу вашего сайта, куда Emotify вернёт человека после входа:
    • только https:// (для локальной отладки годится http://localhost:…);
    • точный адрес без * — например https://site.example.com/auth/callback.

В ответ портал один раз покажет:

Пример
client_idapp-16c6e6b1-2b8d-…публичный идентификатор клиента
client_secretXk29fjA…секрет — храните на сервере, показывается один раз

Шаги входа ​

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.identifyid, имя, аватар (почты нет)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» в кабинете отключает вход для всех пользователей сразу.
  • Человек может отозвать своё согласие сам — токены перестают действовать немедленно.

Документация внешнего API Emotify