javascript - 如何使用 Apollo 实现突变的 auth 指令?

标签 javascript authentication graphql apollo apollo-server

我正在尝试为我正在处理的项目设置一个 Apollo 后端,我正在尝试在其中实现架构指令。但是,我无法将我的模式指令添加到突变中。那么我的主要问题是:如何为突变实现 auth 指令?

我已将 @auth(requires: ADMIN) 添加到我的用户查询的末尾,它工作正常。然后,Apollo 将需要一个具有管理员访问权限的持有者 token 来执行用户查询。

extend type Query {
    user(id: ID!): User
    users: [User!]! @auth(requires: ADMIN)
}

当我尝试以相同的方式对 editMyUser 突变执行此操作时,似乎对所有突变都强制执行 auth 指令,而不仅仅是我想要的突变。当我将 @auth 部分添加到 editMyUser 突变时,即使是 signUp 突变也会给出“未授权”错误。尽管它们之间没有关系。

在调用时应该传递给 auth 指令的 Angular 色字段正在注销为空。

extend type Mutation {
    signUp(
        username: String!
        firstName: String
        lastName: String
        password: String!
        isAdmin: Boolean
        isActive: Boolean): User!
    login(
        username: String!
        password: String!): User!
    editMyUser(
        id: ID!
        firstName: String
        lastName: String
        password: String): User! @auth(requires: USER)
    adminEditUser(
        id: ID!
        firstName: String
        lastName: String
        password: String
        isActive: Boolean
        isAdmin: Boolean
        isBanned: Boolean): User!
}

这就是我实现模式指令的方式

export default gql`
directive @auth(requires: Role = ADMIN) on OBJECT | FIELD_DEFINITION

enum Role {
    ADMIN
    USER
}

https://github.com/jwhenshaw/graphql-directives-auth 这是我在代码中实现的 Auth Directive 以供引用。

总而言之,当我为突变实现 auth 指令时,它们是为所有突变实现的,而不仅仅是一个突变,它甚至无法正常工作,因为 Angular 色没有传递给指令。

我很乐意就此获得一些帮助。谢谢!

最佳答案

在该 repo 中,AuthDirective 类将被包装的字段的 objectType 传递到 ensureFieldWrapped 方法中。这意味着对于您将指令直接分配给 Mutation 对象上的字段 editMyUser 的示例,该方法正在包装 的所有子项>突变(我相信您的查询实际上也应该如此)。

因此,在示例存储库中,这很好,因为我们有一个对象类型 User 并且我们包装了它及其字段。但是,如果您不想这样做,我们可以更改 AuthDirective 类以仅包装它所在的字段。

我已经完成并推送到 repo ,https://github.com/jwhenshaw/graphql-directives-auth ,您现在可以看到 FieldAuthDirectiveObjectAuthDirective。我仍然需要稍微清理一下代码,但推出了一个工作示例并留下了一些日志来帮助突出差异。您可以在这里查看 https://qzj70qn2mj.sse.codesandbox.io/如果您不想在本地运行它。

希望这对您有所帮助,如果我需要详细说明,请告诉我。

关于javascript - 如何使用 Apollo 实现突变的 auth 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54004551/

相关文章:

javascript - 使用 express js、passport s 的安全 GraphQL 查询

javascript - 在 TypeScript 中声明 javascript 命名空间

javascript - 如何替换 getelementbyid 的结果以显示文本链接?

javascript - REgex 不适用于空白 javascript

asp.net-mvc - 如何在 ASP.NET 中使用带有自定义 session key 参数的 session

reactjs - React-router-relay:处理突变的成功或错误

search - Github GraphQL 搜索与过滤

javascript - jQuery ajax 不返回错误或成功或始终

php - $_SERVER ['REMOTE_USER'] 是否被视为 'safe' ?

authentication - 事件目录