微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 graphql codegen 处理 X-Hasura-Role

如何解决如何使用 graphql codegen 处理 X-Hasura-Role

早上好,

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

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

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

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

最好的问候

解决方法

当您在 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 用于与不同的第三方身份验证提供商集成

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。