zoceb
@zoceb
В копюшоне и темных очках

Socket.io авторизация со своим сгенерированным токеном, как?

Предположим что при логине пользователю выдается кука - токен.
Как отталкиваясь от этого сделать авторизацию на socket.io ? (node)
Токен во время авторизации проверится есть ли он в базе, и если есть то дать.

ЗЫ: Нашел несколько манулов но все они были написаны 3 года и более назад. И все написаны по разному что вводит в заблуждение.

Надеюсь на то что у вас уже есть снипет который вы используете в своих проектах и который мог быть мне полезен.
  • Вопрос задан
  • 2636 просмотров
Решения вопроса 1
impeee
@impeee
nodejs/erlang developer
Токен может хранить любую информацию в зашифрованном виде. В случае успешной авторизации поместите в токен такое уникальное значение, на основании которого в последствии вы сможете получить данные пользователя, организовав на их основании сессию. Самый простой случай - хранить в токене уникальный id пользователя. Реализовать можно при помощи плагина "jsonwebtoken".

Создадим отдельный модуль "secure.js" для генерации/расшифровки токена:

let Secure = function() {
  
  const SECRET_PHRASE = 'secret';
  
  let jwt = require('jsonwebtoken');

  let getSecretPhrase = () => {
    return SECRET_PHRASE;
  };
  
  let generateToken = (userEntityId) => {
    return jwt.sign({ 'entity_id' : userEntityId }, SECRET_PHRASE);
  };
  
  let verifyToken = (token) => {
    return jwt.verify(token, SECRET_PHRASE);
  };
  
  return {
    getSecretPhrase : getSecretPhrase,
    generateToken : generateToken,
    verifyToken : verifyToken
  }
  
};

module.exports = new Secure();


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

/* обращаемся к базе, находим пользователя по логину и паролю (userData) */
let secure = require('./secure.js');
var token = { 'token' : secure.generateToken(userData._id) };


На стороне сервер-сокета получаем объект данного токена:

{ token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbnRpdHlfaWQiOiJ0ZXN0IiwiaWF0IjoxNDcxMDA0NDc2fQ.bu0wJbbKpNfyP2uOJWwDuzR89NkfBNmRGqUKXQ03usQ' }


Расшифруем и вытащим из него _id пользователя из авторизации:

let secure = require('./secure.js');
var uid;
try {
uid = secure.verifyToken(token).entity_id;
} catch(e) {
//
}


И по этому uid находим данные в базе.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы