TL;DR 问题是如何从jwt
我正在尝试user
从jwt
请求中发送的信息中获取 a 的信息,但我不想关闭端点以仅登录用户。
我不想用authenticate
钩子关闭端点,但我不知道如何在user
没有它的情况下获取信息。
我正在使用本地策略jwt
。
TL;DR 问题是如何从jwt
我正在尝试user
从jwt
请求中发送的信息中获取 a 的信息,但我不想关闭端点以仅登录用户。
我不想用authenticate
钩子关闭端点,但我不知道如何在user
没有它的情况下获取信息。
我正在使用本地策略jwt
。
即使您不使用身份验证挂钩,请求的身份验证信息(如果有)也将在params.authentication中可用。你可以在自己的钩子中做任何你想做的事情:
module.exports = () => async context => {
const { authentication } = context.params;
// authentication will e.g. be { strategy: 'jwt', accessToken }
// do whatever you like here including throwing errors
}
要获取用户信息或允许匿名访问,请参阅匿名身份验证食谱。
“try/catch”的方法很好,但是还有另一种基于hooks的方法。
1)创建自定义钩子isAuth.js
:
module.exports = (context) => {
return !!(context.params.headers.authorization
&& context.params.headers.authorization !== 'null'
&& context.params.headers.authorization !== '');
};
2) 修复服务hooks.js
(app.service('/my-url').hooks(hooks)
),其中方法授权是可选的。注意:如果用户未被授权,则在“params.user”对象中“user”将不存在。
const { iff } = require('feathers-hooks-common');
const { authenticate } = require('@feathersjs/authentication').hooks;
const isAuth = require('isAuth');
module.exports = {
before: {
find: [iff(isAuth, authenticate('jwt'))],
},
after: {}
};
这是它对我有用的唯一方法。
const { iff } = require('feathers-hooks-common');
const { authenticate } = require('@feathersjs/authentication').hooks;
module.exports = {
before: {
all: [iff(
(({ params: { headers: { authorization }}}) => authorization),
authenticate('jwt')
)],
find: [],
get: [],
create: [],
update: [],
patch: [],
remove: []
},
after: {
all: [],
find: [],
get: [],
create: [],
update: [],
patch: [],
remove: []
},
error: {
all: [],
find: [],
get: [],
create: [],
update: [],
patch: [],
remove: []
}
};
我刚刚验证了授权令牌已发送。
您还可以在 authenticate 钩子周围做一个try
/来尝试对路由进行身份验证,但不会因此而失败,例如catch
const tryAuth = async hook => {
try {
return await authenticate(hook);
} catch(err) {
// do nothing?
return hook;
}
};
在这种情况下,如果有一个有效的令牌,你就会有params.user
,authenticated = true
否则没有。