NodeJS 带有图形屏蔽的Apollo服务器联邦

qfe3c7zg  于 2023-02-08  发布在  Node.js
关注(0)|答案(3)|浏览(102)

我正在使用graphql-shield来保护一个subgraph

const isAuthenticated = rule({ cache: 'contextual' })(async (parent, args, ctx, info) => {
  return ctx.isAuthenticated
})

const permissions = shield({
  Query: {
    '*': and(isAuthenticated)
  },
  Mutation: {
    '*': and(isAuthenticated)
  }
})

const server = new ApolloServer({
    schema: applyMiddleware(buildSubgraphSchema([{ typeDefs, resolvers }]), permissions),
    introspection: global.configuration.ENVIRONMENT === 'development'
})

在我的构建过程中,我使用rover CLI更新Apollo Studio中的supergraph schema

rover subgraph introspect http://localhost/graphql | rover subgraph publish super-graph@development --routing-url http://localhost/graphql --schema - --name persons

rover更新失败,因为权限屏蔽抛出Not Authorised!错误。
如何使用graphql-shield保护subgraph并允许SubgraphIntrospectQuery操作?
我知道可以向Rover内省命令添加承载令牌:

rover subgraph introspect http://localhost/graphql --header "Authorization: Bearer token"

但是,我无法在构建过程中生成访问令牌。

neskvpey

neskvpey1#

您可以尝试允许以下分支:

export const permissions = shield({
    Query: {
        _service: allow,
    },
    _Service: {
        sdl: allow
    }
},{
    fallbackRule: deny,
    allowExternalErrors: true,
    ...
});

当Apollo执行内省时,它最初使用这两个分支。还要注意“allowExternalErrors”标志。当遇到错误时,graphql-shield会吸收它们,这可能会隐藏您试图调试的问题。这 * 可能 * 也是一个问题,尽管您的代码在其他方面看起来很好。
Apollo还使用了“Query._entities”、“Query._service”、“_Entity."、“_Service."、“_Any.*”,但我还没有发现最初的内省使用这些。
您提到您不能为构建过程生成令牌,但是保护这些端点而不是使用allow可能是一个好主意。

4ioopgfo

4ioopgfo2#

我可以通过更改身份验证的范围来解决此问题。
而不是验证所有的“*”

const permissions = shield({
  Query: {
    '*': and(isAuthenticated)
  },
  Mutation: {
    '*': and(isAuthenticated)
  }
})

我更改为验证单个操作:

const permissions = shield({
  Query: {
    'user': and(isAuthenticated),
    'users': and(isAuthenticated)
    ....
  },
  Mutation: {
    'createUser': and(isAuthenticated),
    'updateUser': and(isAuthenticated)
    ....
  }
})
yhuiod9q

yhuiod9q3#

答案是有的,祝你好运:))。

/**
 */
export const permissions = shield(
  {
    Query: {
      "*": deny,
      _service: allow,

      ...,
    },
    Mutation: {
      "*": deny,

      ...,
    },
  },
  {
    fallbackRule: allow,
  },
)

https://github.com/dimatill/graphql-shield/issues/211#issuecomment-450636577

相关问题