首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有授权头的阿波罗服务器executeOperation

带有授权头的阿波罗服务器executeOperation
EN

Stack Overflow用户
提问于 2021-08-15 22:25:11
回答 2查看 929关注 0票数 9

我们如何在测试中将头传递给阿波罗服务器executeOperation

这里提到的是传递headers对象这里

我试图通过带有或不带JWT令牌的auth头来测试访问控制。

代码语言:javascript
复制
const result = await server.executeOperation({ query: query, http: { headers: { authorization: "" } } })

// Type '{ authorization: string; }' is not assignable to type 'Headers'.
//  Object literal may only specify known properties, and 'authorization' does not exist in type 'Headers'.ts(2322)

这将导致类型错误。在fetch.d.ts中的阿波罗服务器类型中定义了一个Header类,但是我无法导入来实例化它。

使用"apollo-server": "^2.25.2"。有什么提示或链接可以让这一切顺利进行吗?

更新:作为一项工作,我在服务器上下文中解密和解码JWT,并在其中传递一个经过身份验证的用户。然后,我可以模拟整个上下文,并使用模拟的上下文创建一个新的测试服务器。很高兴能够使用标题来获得更多的产品(比如体验),但这对目前来说是可行的。

代码语言:javascript
复制
import { mockDeep, mockReset } from 'jest-mock-extended'

interface Context {
  prisma: PrismaClient
  user: () => User|null
}

export const context = mockDeep<Context>()

export const testServer = new ApolloServer({
  typeDefs,
  resolvers,
  context
});

// ...

context.user.mockReturnValue({
  id: 1,
  name: "Foo",
  slug: "foo",
})

const res = await testServer.executeOperation({ query: query })
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-10 01:09:13

阿波罗服务器现在支持executeOperation的第二个参数。可以提供上下文函数中使用的参数。

代码语言:javascript
复制
  const result = await server.executeOperation(
    { query: query },
    { req: { headers: { authorization: '...' } } }
  );

注意:使用类型记录,它会抱怨,但您可以将其转换为任意类型,并避免构建整个express.Request类型。

用阿波罗-服务器-core@3.5.0测试

另一种解决方案有效,但我发现这一种方法很方便。如果您模拟令牌解析,您可以很容易地模拟来自不同用户的调用。

票数 3
EN

Stack Overflow用户

发布于 2022-05-15 05:21:15

为了解决这个问题,我使用已经解密的JWT令牌创建了一个“假”请求对象,用于初始化第三方auth对象(keycloak)并传递给阿波罗上下文。我需要初始化keycloak对象,因为我有身份验证模式指令,需要初始化keycloak对象。

代码语言:javascript
复制
 const req = {
      kauth: {
        grant: {
          access_token: {
            isExpired: () => {
              return false;
            },
            token: "abc",
            content: {
              email: "me@me.com",
              resource_access: {
                "my-api": {
                  roles: ["admin"],
                },
              },
            },
          },
        },
      },
    };

    server = new ApolloServer({
      schema,
      resolvers,
      dataSources: () => ({
        users,
      }),
      context: () => {
        return { kauth: new KeycloakContext({ req }) };
      },
    });
  });

不过,我还是想要一种更适合阿波罗的解决方案,而不是一项工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68795743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档