1

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用来更新supergraph schemaApollo Studio 中的:

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

更新失败,rover因为权限屏蔽引发Not Authorised!错误。

我如何保护subgraphgraphql-shield允许SubgraphIntrospectQuery操作?

我了解可以将承载令牌添加到流动站自省命令:

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

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

4

2 回答 2

0

我能够通过更改身份验证范围来解决此问题。

而不是验证所有“*”

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)
    ....
  }
})
于 2021-10-16T09:40:56.197 回答
0

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

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.*”,但我还没有发现最初的自省会使用它。

您提到您无法为构建过程生成令牌,但保护这些端点而不是使用允许可能是个好主意。

于 2022-03-03T09:25:16.653 回答