【问题标题】:How to handle X-Hasura-Role with graphql codegen如何使用 graphql codegen 处理 X-Hasura-Role
【发布时间】:2021-04-10 23:51:18
【问题描述】:

早上好,

我有一个使用 GraphQL 代码生成的 Angular WebApp(apollo-angular 插件和所有 typescript 插件)。一切正常,但我想处理 Hasura 角色和 Hasura 用户 ID。在 Hasura 控制台中,一切都已正确配置并正常工作。

我唯一缺少的是如何在前端处理这个问题。我需要在发送到 Hasura 的每个请求中添加 X-Hasura-RoleX-Hasura-User-Id 标头。 有没有办法用 graphql-codegen 做到这一点? 这样做的正确方法是什么?

我知道我可以在 codegen.yml 上添加 headers 部分,但显然角色和用户 ID 是动态的,所以我不能在那里硬编码任何内容。

我应该使用customFetch 组件吗?这个组件,认为,应该只拦截发送到 Hasura 的每个请求并添加所需的标头。我不知道如何做到这一点,所以我希望你能帮助我(我也希望有更好的解决方案)

最好的问候

【问题讨论】:

    标签: graphql apollo roles hasura codegen


    【解决方案1】:

    当您在 Angular 应用程序中创建 Apollo 客户端实例时,您可以将其设置为传递 Authorization 标头,该标头应包含用户的 id 及其角色。

    Angular Apollo docs 中有这样的例子。例如:

    import { NgModule } from '@angular/core';
    import { HttpClientModule } from '@angular/common/http';
    import { Apollo, APOLLO_OPTIONS } from 'apollo-angular';
    import { HttpLink } from 'apollo-angular/http';
    import { InMemoryCache,ApolloLink } from '@apollo/client/core';
    import { setContext } from '@apollo/client/link/context';
    
    const uri = '/graphql';
    
    export function createApollo(httpLink: HttpLink) {
      const basic = setContext((operation, context) => ({
        headers: {
          Accept: 'charset=utf-8'
        }
      }));
    
      const auth = setContext((operation, context) => {
        const token = localStorage.getItem('token');
    
        if (token === null) {
          return {};
        } else {
          return {
            headers: {
              Authorization: `JWT ${token}`
            }
          };
        }
      });
    
      const link = ApolloLink.from([basic, auth, httpLink.create({ uri })]);
      const cache = new InMemoryCache();
    
      return {
        link,
        cache
      }
    }
    
    @NgModule({
      exports: [
        HttpClientModule,
      ],
      providers: [{
        provide: APOLLO_OPTIONS,
        useFactory: createApollo,
        deps: [HttpLink]
      }]
    })
    export class GraphQLModule {}
    
    

    您可以确保与您的请求一起传递的 JWT 令牌在前端可用。最终,您将不得不实施某种身份验证方法,以允许用户登录并将令牌传递给您的前端应用程序。

    更多信息请访问Hasura Docs for Authentication

    还有一些 tutorials and guides 用于与不同的第三方身份验证提供程序集成

    【讨论】:

    • 谢谢,这将非常有用!我会尽快试试这个,让我们看看它是如何工作的。我对这一切都很陌生,所以我希望我不会发现任何重大并发症,
    • @GiammarcoBoscaro 没问题。如果它对社区的其他人有帮助,请随意投票或将其标记为答案
    • 当然!答案很有帮助,即使我仍然遇到一些问题。不是你犯规,而是星云的错。当我收到响应时,我需要保存令牌,所以当我创建 Apollo 客户端时,我已经准备好角色和用户 ID。可悲的是,当在 Nebular 中完成登录时,我似乎无法添加自定义函数作为回调,所以我无法在 Apollo Client 初始化之前保存这些标头,因此显然标头未定义。仍在努力寻找使其发挥作用的方法。
    猜你喜欢
    • 2020-07-12
    • 2020-11-17
    • 1970-01-01
    • 2020-08-13
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多