【问题标题】:Apollo Server: How to pass authorization token to remote schemaApollo Server:如何将授权令牌传递给远程模式
【发布时间】:2019-07-27 14:04:32
【问题描述】:

我创建了一个使用远程模式的 ApolloServer。远程模式需要一个授权令牌,我可以从请求中获取到我的阿波罗服务器。这是阿波罗服务器的代码。我可以在 customFetch 函数中对令牌进行硬编码,一切正常,但我想将调用时获得的令牌传递给我的服务器。

import {makeRemoteExecutableSchema, introspectSchema, mergeSchemas} from 'graphql-tools';
import {HttpLink} from 'apollo-link-http';
import {ApolloServer} from 'apollo-server';
import fetch from 'node-fetch';

// create executable schemas from remote GraphQL APIs
const customFetch = (uri, options) => {
  // How do I set the token from my server req??
  options.headers.Authorization =
    'Bearer eyJhbGciOiJIUzI1NiIsI Not A Real Token kf5iOg9SkxDBVtQnLJuz3hXEDA';
  return fetch(uri, options);
};

const createRemoteExecutableSchemas = async () => {
  let schemas = [];
  const link = new HttpLink({
    uri: 'http://remote.graphql.server:5555/graphql',
    fetch: customFetch,
  });
  const remoteSchema = await introspectSchema(link);
  const remoteExecutableSchema = makeRemoteExecutableSchema({
    schema: remoteSchema,
    link,
  });
  schemas.push(remoteExecutableSchema);
  return schemas;
};

const createNewSchema = async () => {
  const schemas = await createRemoteExecutableSchemas();
  return mergeSchemas({
    schemas,
  });
};

const runServer = async () => {
  const schema = await createNewSchema();
  const server = new ApolloServer({
    schema
  });
  server.listen().then(({url}) => {
    console.log(`????  Server ready at ${url}`);
  });
};

try {
  runServer();
} catch (err) {
  console.error(err);
}

【问题讨论】:

    标签: apollo-server


    【解决方案1】:

    我自己已经为此苦苦挣扎了一段时间。 尝试下一种方法:

    const express = require('express');
    const { introspectSchema, makeRemoteExecutableSchema, ApolloServer } = require('apollo-server-express');
    const { HttpLink } = require('apollo-link-http');
    const fetch = require('node-fetch');
    const { setContext } = require('apollo-link-context');
    
    async function runServer() {
        const httpLink = new HttpLink({ uri: 'http://remote.graphql.server:5555/graphql', fetch });
        const link = setContext((request, prevContext) => {
            if (prevContext.graphqlContext && prevContext.graphqlContext.headers) {
                return {
                    headers: {
                        'Authorization': prevContext.graphqlContext.headers.authorization,
                    }
                }
            } else {
                return {}
            }
        }).concat(httpLink);
    
        const schema = await introspectSchema(link);
    
        const executableSchema = makeRemoteExecutableSchema({
            schema,
            link,
        });
    
        const server = new ApolloServer({
            schema: executableSchema,
            context: ({ req }) => ({
                headers: req.headers
              }),
        });
    
        // middleware
        const app = express();
        server.applyMiddleware({ app });
    
        app.listen({ port: 4000 }, () =>
            console.log(
                '? Server ready at localhost:4000',
            )
        )
    }
    
    runServer();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-18
      • 2017-06-27
      • 1970-01-01
      • 2021-03-02
      • 2020-03-25
      • 2011-07-29
      • 2023-02-09
      • 2013-01-21
      相关资源
      最近更新 更多