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'
})

私のビルド プロセスでは、Apollo Studiorover CLIの更新に使用しています。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!ます。

subgraphwithを保護し、操作graphql-shieldを許可するにはどうすればよいSubgraphIntrospectQueryですか?

ローバー イントロスペクト コマンドにベアラー トークンを追加できることを理解しています。

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

ただし、ビルド プロセス中にアクセス トークンを生成する方法はありません。

4

2 に答える 2

0

次のブランチを許可してみてください。

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

Apollo がイントロスペクションを実行するとき、最初にこれら 2 つのブランチを使用します。「allowExternalErrors」フラグにも注意してください。エラーが発生すると、graphql-shield がそれらを吸収し、デバッグしようとしている問題を隠すことができます。これも問題になる可能性がありますが、それ以外の場合はコードは問題ないようです。

Apollo は "Query._entities"、"Query._service"、"_Entity.*"、"_Service.*"、"_Any.*" も使用しますが、これが最初のイントロスペクションで使用されることはわかりませんでした。

ビルド プロセスのトークンを生成できないとおっしゃいましたが、allow を使用するのではなく、これらのエンドポイントを保護することをお勧めします。

于 2022-03-03T09:25:16.653 に答える