#node.js #socket.io #feathersjs #feathers-authentication
#node.js #socket.io #feathersjs #feathers-аутентификация
Вопрос:
Как я могу аутентифицироваться в 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 (сервер feathers)
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')
]
}
});
};
Я пытался использовать секрет в качестве средства доступа, но это не сработало 🙂
default.json (конфигурация сервера feathers)
"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"
}
},
...
Благодарен за все ответы!
Комментарии:
1. Привет, Робин, вам нужно будет создать токен доступа, войдя в систему или используя пользовательскую стратегию, при которой у обоих есть общий секрет, который они используют для аутентификации друг друга.
2. Спасибо @mchaffe! Но куда входить в систему? еще раз спасибо.
Ответ №1:
Для того, чтобы получить accessToken
вам обычно потребуется аутентифицироваться с помощью стратегии, использующей email/password
или oauth
. Это вернет значение, accessToken
которое затем можно использовать для jwt
аутентификации.
Альтернативным подходом было бы использование пользовательской стратегии аутентификации, которая позволила бы вам иметь общий секрет, который оба сервера могли бы использовать для связи друг с другом.
Ответ №2:
Спасибо @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? Еще раз спасибо!
Комментарии:
1. Если вы используете клиент, вы должны иметь возможность использовать клиент для вызова служб feathers, а не использовать сокет напрямую.
client.service(‘messages’).create({ text: ‘new message’ })
это будет отправлено с использованием сокетов, поэтому нет необходимости напрямую подключаться к сокету.