Аутентификация в Featherjs с использованием socket.io-client - PullRequest
0 голосов
/ 26 марта 2019

Как я могу пройти аутентификацию в Feathersjs (https://docs.feathersjs.com/api/client/socketio.html#authentication) с использованием прямого подключения (https://docs.feathersjs.com/api/client/socketio.html#direct-connection)?) Следующий код говорит, что мой accessToken искажен, но я подозреваю, что есть нечто большее, чтобы заставить его работать. Где Я получаю accessToken?

app.js (клиент):

import express from 'express';

const socket = require('socket.io-client')('http://localhost:3030', {
  transports: ['websocket']
});

socket.emit('authenticate', { 
  strategy: 'jwt',
  accessToken: 'what to enter here'
}, (message: any, data: any) => {
  console.log(message);
  console.log(data);
});

const app = express();

app.get('/', (req, res) => res.send('Up and running!'));

app.listen(4390, () => console.log('Example app listening on port 4390!'));

authentication.js (сервер перьев)

const authentication = require('@feathersjs/authentication');
const jwt = require('@feathersjs/authentication-jwt');
const local = require('@feathersjs/authentication-local');

module.exports = function (app) {
  const config = app.get('authentication');

  // Set up authentication with the secret
  app.configure(authentication(config));
  app.configure(jwt());
  app.configure(local());

  app.service('authentication').hooks({
    before: {
      create: [
        authentication.hooks.authenticate(config.strategies),
      ],
      remove: [
        authentication.hooks.authenticate('jwt')
      ]
    }
  });
};

Я пытался использовать секрет как accessToken, но он не работал :) default.json (конфигурация сервера перьев)

"authentication": {
    "secret": "r323r32rada86700f18d82ea1d3e74fb58141dbefcd7460ef71736759265e347151a12d68dff50aa59c05e2f18db88661be8ae91a3f12932fddea8891b5ca9f63b5e4fc650edabc59d0d14e8fe4ea54256e7e386845321ab58a320a9ec99438bd058a3fbbda65dadf97bc9585ea82f72201f932beqwdqwdqwd5761a0d0be3e95474db5b9c8a3f4c7303beed0344a1768ba5dad6a1c916d183ea5dd923587768661ff0b08f25ed85dff4ff4e6b58327fe5914e5e7fb2356ee67754b102434f22686444a35fc38c75bcdd6386240a22e0cf62bdc7f227200868da387174b365af2afa7dec378c4ccf22956b134a3ec961fd1ba8d3dc85a7594ab711",
    "strategies": [
      "jwt",
      "local"
    ],
    "path": "/authentication",
    "service": "users",
    "jwt": {
      "header": {
        "typ": "access"
      },
      "audience": "https://yourdomain.com",
      "subject": "anonymous",
      "issuer": "feathers",
      "algorithm": "HS256",
      "expiresIn": "1d"
    },
    "local": {
      "entity": "user",
      "usernameField": "email",
      "passwordField": "password"
    }
  },
...

Благодарен за все ответы!

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Чтобы получить accessToken, вам, как правило, необходимо пройти аутентификацию с использованием стратегии, используя email/password или oauth. Это вернет accessToken, который вы затем сможете использовать для jwt аутентификации.

Альтернативным подходом будет использование пользовательской стратегии аутентификации , которая позволит вам иметь общий секрет, который оба сервера могут использовать для связи друг с другом.

0 голосов
/ 27 марта 2019

Спасибо, @mchaffe! Мне удалось решить это с вашей помощью. Вот используемый код:

import dotenv from 'dotenv';

// Load environments
const config = dotenv.config()
if (config.error) throw config.error

const io = require('socket.io-client');
const feathers = require('@feathersjs/client');
const localStorage = require('localstorage-memory');

const client = feathers();

const socket = io('http://localhost:3030/', {
  transports: ['websocket'],
  forceNew: true
});

client.configure(feathers.socketio(socket), {
  timeout: 10000
});

client.configure(feathers.authentication({
  jwtStrategy: 'jwt',
  storage: localStorage,
  storageKey: 'some-token'
}));

const payload = {
  strategy: 'local',
  email: process.env.FEATHERS_AUTHENTICATION_EMAIL,
  password: process.env.FEATHERS_AUTHENTICATION_PASSWORD
};

client.authenticate(payload).then((response: any) => {
  // Do stuff to hooray here
  console.log('Access Token: ' + response.accessToken);

  // Works!
  socket.emit('get', 'logger', 1, (error: any, log: any) => {
    console.log('Found log: ' + JSON.stringify(log));
  });

}).catch((e: any) =>  {
  console.log('Error: ' + e); 
});

Я весь слух, если у вас есть предложения по улучшению! :) Кажется, я могу получить доступ к данным из базы данных, используя метод socket.emit. Нужно ли проверять возвращенный accessToken? Еще раз спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...