通过 POST 的 Feathers 身份验证有效,但套接字无效
Feathers Authentication via POST works but socket doesn't
Here is a repo showing my latest progress, and here is my configuration。就目前而言,repo 现在甚至不使用 REST 进行身份验证 - 尽管我认为需要查看的套接字身份验证有问题。
我配置了 feathers,能够使用 Postman 创建用户 REST-fully,甚至获得授权令牌(我可以 post 到 /authenticate 获得令牌,然后验证该令牌 - 耶post伙计!是的休息 api!).
但在浏览器中,情况就不那么愉快了。我可以使用 find
取回数据,但 authenticate
只会给我错误。
在我的谷歌搜索中,我找到了 and updated my client javascript to be this。我也尝试过使用来自 postman 的令牌进行 jwt
身份验证,但这会产生相同的 Missing Credentials
错误。哈尔普!
代码传入...
app.js(仅显示顺序的配置部分)
app.configure(configuration(path.join(__dirname, '..')))
.use(cors())
.use(helmet()) // best security practices
.use(compress())
.use(favicon(path.join(app.get('public'), 'favicon.ico')))
.use('/', feathers.static(app.get('public')))
.configure(socketio())
.configure(rest())
.configure(hooks())
.use(bodyParser.json())
.use(bodyParser.urlencoded({ extended: true }))
.configure(services) // pull in all services from services/index.js
.configure(middleware) // middleware from middleware/index.js
.hooks(appHooks)
在服务中,我首先添加身份验证,它在它自己的文件中,看起来像这样
authentication.js
const authentication = require('feathers-authentication');
const jwt = require('feathers-authentication-jwt');
const local = require('feathers-authentication-local');
const authManagement = require('feathers-authentication-management');
module.exports = function () {
const app = this;
const config = app.get('authentication');
// Set up authentication with the secret
app.configure(authentication(config));
app.configure(authManagement(config));
app.configure(jwt());
app.configure(local(config.local));
// The `authentication` service is used to create a JWT.
// The before `create` hook registers strategies that can be used
// to create a new valid JWT (e.g. local or oauth2)
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies)
],
remove: [
authentication.hooks.authenticate('jwt')
]
}
});
};
index.html(大部分被剥离,只显示相关脚本)
let url = location.protocol + '//' + location.hostname +
(location.port
? ':' + location.port
: '');
const socket = io(url);
const feathersClient = feathers()
.configure(feathers.socketio(socket))
.configure(feathers.hooks())
.configure(feathers.authentication({ storage: window.localStorage }));
这是显示 chrome 调试器和 postman 中的一些请求的屏幕截图。
当 default.json 设置为使用 'username' 作为用户名字段时,它会输出我的 Windows 用户名 'Matt'。这是因为 feathers-configuration 检查一个值是否是 OS 环境的一部分。
https://github.com/feathersjs/feathers-configuration/blob/master/src/index.js#L26
解决方法
在authentication.js中手动设置此配置,例如:
// Set up authentication with the secret
const localConfig = {
'entity': 'users',
'service': 'users',
'usernameField': 'username',
'passwordField': 'password'
};
app.configure(authentication(config));
app.configure(local(localConfig));
Here is a repo showing my latest progress, and here is my configuration。就目前而言,repo 现在甚至不使用 REST 进行身份验证 - 尽管我认为需要查看的套接字身份验证有问题。
我配置了 feathers,能够使用 Postman 创建用户 REST-fully,甚至获得授权令牌(我可以 post 到 /authenticate 获得令牌,然后验证该令牌 - 耶post伙计!是的休息 api!).
但在浏览器中,情况就不那么愉快了。我可以使用 find
取回数据,但 authenticate
只会给我错误。
在我的谷歌搜索中,我找到了 jwt
身份验证,但这会产生相同的 Missing Credentials
错误。哈尔普!
代码传入...
app.js(仅显示顺序的配置部分)
app.configure(configuration(path.join(__dirname, '..')))
.use(cors())
.use(helmet()) // best security practices
.use(compress())
.use(favicon(path.join(app.get('public'), 'favicon.ico')))
.use('/', feathers.static(app.get('public')))
.configure(socketio())
.configure(rest())
.configure(hooks())
.use(bodyParser.json())
.use(bodyParser.urlencoded({ extended: true }))
.configure(services) // pull in all services from services/index.js
.configure(middleware) // middleware from middleware/index.js
.hooks(appHooks)
在服务中,我首先添加身份验证,它在它自己的文件中,看起来像这样 authentication.js
const authentication = require('feathers-authentication');
const jwt = require('feathers-authentication-jwt');
const local = require('feathers-authentication-local');
const authManagement = require('feathers-authentication-management');
module.exports = function () {
const app = this;
const config = app.get('authentication');
// Set up authentication with the secret
app.configure(authentication(config));
app.configure(authManagement(config));
app.configure(jwt());
app.configure(local(config.local));
// The `authentication` service is used to create a JWT.
// The before `create` hook registers strategies that can be used
// to create a new valid JWT (e.g. local or oauth2)
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies)
],
remove: [
authentication.hooks.authenticate('jwt')
]
}
});
};
index.html(大部分被剥离,只显示相关脚本)
let url = location.protocol + '//' + location.hostname +
(location.port
? ':' + location.port
: '');
const socket = io(url);
const feathersClient = feathers()
.configure(feathers.socketio(socket))
.configure(feathers.hooks())
.configure(feathers.authentication({ storage: window.localStorage }));
这是显示 chrome 调试器和 postman 中的一些请求的屏幕截图。
当 default.json 设置为使用 'username' 作为用户名字段时,它会输出我的 Windows 用户名 'Matt'。这是因为 feathers-configuration 检查一个值是否是 OS 环境的一部分。
https://github.com/feathersjs/feathers-configuration/blob/master/src/index.js#L26
解决方法
在authentication.js中手动设置此配置,例如:
// Set up authentication with the secret
const localConfig = {
'entity': 'users',
'service': 'users',
'usernameField': 'username',
'passwordField': 'password'
};
app.configure(authentication(config));
app.configure(local(localConfig));