如何将用户传递给请求? 有没有可能的方法来实现像 SubscriptionAuthGuard 这样的东西?
没有订阅,一切正常
代码:
GraphQLModule.forRoot({
installSubscriptionHandlers: true,
subscriptions: {
'subscriptions-transport-ws': {
onConnect: (connectionParams, webSocket) =>
new Promise((resolve) => {
passportInit(webSocket.upgradeReq, {} as any, () => {
resolve(webSocket.upgradeReq);
});
}),
},
},
context: ({ req }) => ({ req }),
}),
错误:
TypeError: Cannot set property 'authInfo' of undefined
最佳答案
这对我有用,我正在使用 JWT 和不记名 token 。
GraphQL.模块:
'subscriptions-transport-ws': {
path: '/graphql',
onConnect: (connectionParams) => {
return {
req: {
headers: { authorization:
connectionParams.Authorization ??
connectionParams.authorization,
},
},
};
},
},
守卫:
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
async canActivate(context: ExecutionContext): Promise<boolean> {
try {
return (await super.canActivate(context)) as boolean;
} catch (e) {
throw new AuthenticationError(generalErrorMessages.invalidToken);
}
}
getRequest(context: ExecutionContext): Request {
const ctx = GqlExecutionContext.create(context);
return ctx.getContext().req;
}
}
关于cookies - 如何为 graphql 订阅实现身份验证防护(passportjs + cookies),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70476608/