要使用 Auth0 作为授权服务来处理 AppSync 的未授权错误,您可以按照以下步骤进行操作:
在 Auth0 中创建一个应用程序,并获取到相关的客户端ID和客户端秘钥。
在 AppSync 的 schema 文件中定义一个自定义指令(directive),用于检验用户是否已经获得了授权。示例代码如下:
directive @auth0(
requires: String!
) on OBJECT | FIELD_DEFINITION
type Query {
getUser: User! @auth0(requires: "read:user")
}
type User {
id: ID!
name: String!
}
const { AuthenticationError } = require('apollo-server');
const { verify } = require('jsonwebtoken');
const verifyToken = async (token) => {
return new Promise((resolve, reject) => {
verify(token, AUTH0_CLIENT_SECRET, (err, decoded) => {
if (err) {
reject(err);
} else {
resolve(decoded);
}
});
});
};
const resolvers = {
Query: {
getUser: async (_, __, { headers }) => {
const authorization = headers.authorization;
if (!authorization) {
throw new AuthenticationError('Unauthorized');
}
const token = authorization.replace('Bearer ', '');
const decoded = await verifyToken(token);
// 在这里可以校验是否具备访问 getUser 的权限
return {
id: decoded.sub,
name: decoded.name,
};
},
},
};
在上面的代码中,我们用 verifyToken
函数来验证传递的 JWT Token,并在 getUser
resolver 中进行了简单的授权检查。您可以根据自己的需求来实现更详细的授权逻辑。
请注意,上述代码中的 AUTH0_CLIENT_SECRET
需要替换为您在 Auth0 中创建的应用程序的客户端秘钥。
现在,当用户未经授权尝试访问受保护的查询时,将会收到未授权的错误。