我正在使用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"
但是,我无法在构建过程中生成访问令牌。
3条答案
按热度按时间neskvpey1#
您可以尝试允许以下分支:
当Apollo执行内省时,它最初使用这两个分支。还要注意“allowExternalErrors”标志。当遇到错误时,graphql-shield会吸收它们,这可能会隐藏您试图调试的问题。这 * 可能 * 也是一个问题,尽管您的代码在其他方面看起来很好。
Apollo还使用了“Query._entities”、“Query._service”、“_Entity."、“_Service."、“_Any.*”,但我还没有发现最初的内省使用这些。
您提到您不能为构建过程生成令牌,但是保护这些端点而不是使用allow可能是一个好主意。
4ioopgfo2#
我可以通过更改身份验证的范围来解决此问题。
而不是验证所有的“*”
我更改为验证单个操作:
yhuiod9q3#
答案是有的,祝你好运:))。
https://github.com/dimatill/graphql-shield/issues/211#issuecomment-450636577