如何在自定义TypeGraphQL AuthChecker中从请求标头获得授权



我正在使用TypeORM/GraphQL/ApolloServer为学校项目制作一个自定义的AuthChecker,我得到了一个AuthChecker的模板,如下所示:

export const authChecker: AuthChecker<Context> = async (
{ root, args, context, info },
roles
) => {
const authorization = context.req.headers.authorization
if(!authorization) return false
try {
const token = authorization.split(' ')[1]
const payload = verify(token, process.env.ACCESS_TOKEN_SECRET!) as AccessTokenPayload
context.payload = payload
} catch (err) {
log.info(err.message)
return false
}
const user = await User.findOne(context.payload.userId)
if (!user) return false
return true
}

有了这个,我得到了错误Property 'authorization' does not exist on type 'Headers'.ts(2339)

我还尝试了使用不同标头名称(如"Authorization""authorization"(的context.req.headers.get("header name"),在编译时,当在@Authorized字段上使用Apollo Explorer接口运行查询时,它会给出一个错误作为响应:

{
"errors": [
{
"name": "GraphQLError",
"message": "context.req.headers.get is not a function"
...

我怀疑错误一定是我的上下文,它是这样定义的:

export interface Context {
req: Request
res: Response
payload: AccessTokenPayload
}
export interface AccessTokenPayload {
userId: number
}

但我真的不知道这里出了什么问题,几个小时的搜索并没有真正帮助我。我的索引文件如下:

( async () => {
await createConnection()
const server = new ApolloServer({
schema: await buildSchema({
resolvers: [
__dirname + '/**/*Resolver.{ts,js}',
],
authChecker: authChecker,
globalMiddlewares: [
ErrorInterceptor
]
}),
context: ({ req, res }) => ({ req, res }),
})
console.log(`🚀  Server ready at ${url}`)
})
})()

我还尝试打印context.req.headers,它给出:

{
host: 'localhost:4000',
connection: 'keep-alive',
'content-length': '104',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"',       
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
'sec-ch-ua-platform': '"Windows"',
'content-type': 'application/json',
accept: '*/*',
origin: 'https://studio.apollographql.com',
'sec-fetch-site': 'cross-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.9,nb-NO;q=0.8,nb;q=0.7'
}

我对http请求/响应/标头了解不多,所以不知道该怎么做,看起来真的不是正确的排序吗?!

发现问题是一个简单的导入错误,Context接口使用默认的Fetch API请求/响应接口,而不是Express请求/响应界面。

最新更新