GraphQL(三) - Authentication 和 Authorication

这篇具有很好参考价值的文章主要介绍了GraphQL(三) - Authentication 和 Authorication。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文介绍GraphQL中的Authenication和Authorication

参考:

  • https://graphql.org/learn/authorization/
  • https://www.apollographql.com/docs/apollo-server/security/authentication/

Authenication和Authorication的区别

Authenication 和 Authorication 的概念十分容易混淆,两者的定义如下:

  • Authenication 指用户认证,即是否有用户登录,哪个用户登录
  • Authorication 指用户权限认证,再具体的操作中决定用户是否有权利使用查看数据或调用方法

Authenication

提供用户的authenication有多种方式,包括HTTP header和JSON web token。
下面给出一个创建Authenication的示例

创建用户组的schema

分别创建一个用户信息的type,并定义创建用户和登录的方法

type AuthPayload {
	token: String!
	name: String!
}

input UserCreateInput {
	name: String!
	password: String!
}

type Mutation {
	createUser(data: UserCreateInput): String
	login(data: UserCreateInput): AuthPayload
	logout(data: UserCreateInput, param: Int!): Int
}
定义本地CreateUser和Login的Resolver

通常情况下,用户在用前端创建用户时,会传入用户名和密码,后端不会直接保存用户密码,而是将用户信息加密为webtoken储存起来,而login的情况下,也是会将用户用户名和密码的信息与weebtoken进行比对。
可以在context中,设置一个用户组缓存来储存数据,同样适用于将用户信息储存于数据库或云端。

const resolver = {
	Mutation: {
		createUser: async (parent: any, args: any, ctx: any, info: any) => {
		  if (args.data.password.length < 8) {
			throw new Error('Password must be 8 characters or longer.')
		  }
		  const password = await bcrypt.hash(args.data.password, 10);
		  const id = uuidv4();
		  const token = jwt.sign({ userId: id }, 'password');
		  ctx.users.push({
			id,
			name: args.data.name,
			password,
			token
		  });
		  return token;
		},
		login: async (parent: any, args: any, ctx: any, info: any) => {
		  const user = ctx.users.find(u => u.name === args.data.name);
		  if (!user) throw Error('User not exist');
		  const isMatch = await bcrypt.compare(args.data.password, user.password);
		  if (!isMatch) throw new Error('Password mismatch');
		  return {
			name: user.name,
			token: user.token ? user.token : jwt.sign({ userId: user.id }, 'password'),
		  }
		},
	}
}

Authorization

用上述步骤执行完Authentication的操作以后,需要验证用户操作函数是否有权限只需要在相应方法的Resolver中进行验证即可,调用Query或Mutation可以在Header中添加一个由后端返回给前端的token,示例如下:

后端:

const getUserId = (request) => {
  const token = request.headers.authorization;
  if (!token) {
    throw new Error('Authentication required')
  }
  const decoded = jwt.verify(token, 'password')
  return decoded.userId
}

const resolver = {
	Mutation: {
		callFunction: async (parent: any, args: any, ctx: any, info: any) => {
			const id = getUserId(ctx.request);
			if (!id) throw Error('ID not exist');
			// Do operation
		}
	}
}

在Apollo GraphQL中可以在前端的header加一个authorication的字段,输入token:

GraphQL(三) - Authentication 和 Authorication

前端可以在创建Apollo GraohQL Module时,创建一个MidWare包含我们的header:文章来源地址https://www.toymoban.com/news/detail-807362.html

const authMiddleware = new ApolloLink((operation: any, forward: any) => {
  operation.setContext({
    headers: new HttpHeaders().set(
      "Authorization",
      "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."	//Token
    ),
  });
  return forward(operation);
});

export function createApollo(httpLink: HttpLink): ApolloClientOptions<any> {
  return {
    link: httpLink.create({uri}),
    cache: new InMemoryCache(),
  };
}
export function createApolloWithAuth(httpLink: HttpLink): ApolloClientOptions<any> {
  return {
    link:  from([
      authMiddleware,
      httpLink.create({
        uri,
      }),
    ]),
    cache: new InMemoryCache(),
  };
}

到了这里,关于GraphQL(三) - Authentication 和 Authorication的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GraphQL注入

    GraphQL是一种查询语言,用于API设计和数据交互,不仅仅用于查询数据库。GraphQL 允许客户端在一个请求中明确地指定需要的数据,并返回预期的结果;并且将数据查询和数据修改分离开,大大增加灵活性。GraphQL正在迅猛发展,但也存在着一些安全问题。 GraphQL支持多种查询方

    2024年04月13日
    浏览(32)
  • Graphql mock 方案

    GraphQL API 的强类型本质非常适合模拟。模拟是 GraphQL Code-First 开发过程的重要组成部分,它使前端开发人员能够构建 UI 组件和功能,而无需等待后端实现。 我们期望基于 TS 强类型定义的特点以及中后台常见列表、详情的数据类型共性,实现对 GraphQL API 的数据 mock,减少手写

    2024年04月25日
    浏览(39)
  • vscode GraphQL插件踩坑

    vscode的GraphQL语法插件, 目前比较推荐 Graphql Foundation 的 GraphQL: Language Feature Support 相关配置, 见[GraphQL: Language Feature Support](# GraphQL: Language Feature Support) 配置文件的语法规则, 参考GraphQL Config 之前用的GraphQL插件, 只开启了语法高亮. 自己写的schema没什么问题, 排查问题时, 只能靠搜

    2024年02月16日
    浏览(39)
  • Graphql中的N+1问题

    原文出处 Graphql 是一种 API 查询语言和运行时环境,可以帮助开发人员快速构建可伸缩的 API。然而,尽管 Graphql 可以提供一些优秀的查询性能和数据获取的能力,但是在使用 Graphql 的过程中,开发人员也会遇到一些常见问题,其中最常见的一个问题是 N+1 问题。 在 GraphQL 中,

    2024年02月12日
    浏览(35)
  • Spring Boot中使用GraphQL

    GraphQL是Facebook的一个相对较新的概念,被称为Web API的REST的替代品。 在本文中,我们将学习如何使用 Spring Boot 设置 GraphQL 服务器,以便我们可以将其添加到现有应用程序中或在新应用程序中使用它。 传统的 REST API 使用服务器管理资源的概念。我们可以使用各种HTTP请求以一些

    2024年02月15日
    浏览(31)
  • springboot集成Graphql相关问题汇总

    1、idea在debug运行时出现java.lang.NoClassDefFoundError:kotlin/collections/AbstractMutableMap 解决:禁用idea dubugger中kotlin coroutine agent 见:https://stackoverflow.com/questions/70796177/after-the-spring-boot-source-code-is-compiled-it-starts-to-report-an-error-in-d

    2024年02月12日
    浏览(43)
  • GraphQL渗透测试案例及防御办法

    GraphQL 是一种 API 查询语言,旨在促进客户端和服务器之间的高效通信。它使用户能够准确指定他们在响应中所需的数据,从而有助于避免有时使用 REST API 看到的大型响应对象和多个调用。 GraphQL 服务定义了一个合约,客户端可以通过该合约与服务器进行通信。客户端不需要

    2024年02月10日
    浏览(47)
  • 何时使用 GraphQL、gRPC 和 REST?

    构建 API 是现代工程中开发人员的最重要任务之一。这些 API 允许不同的系统进行通信和数据交换。虽然  REST  多年来一直是实现 API 的事实标准,但今天也有新兴的标准,如  gRPC  和  GraphQL 。 “应用程序编程接口”(API)是各种软件服务之间的通信渠道。传输请求和响应

    2024年04月25日
    浏览(27)
  • uniswap前端项目构建schema.graphql失败

    uniswap构建前端项目也就是interface时出现如下报错! 观察到是在执行node fetch-schema.js时出现的错误,我们看一下里面的代码。 代码很简单,就是通过get-graphql-schema的命令分别在THE_GRAPH_SCHEMA_ENDPOINT,和REACT_APP_AWS_API_ENDPOINT地址中下载the graph的配置文件。看报错信息应该是没有访

    2024年02月16日
    浏览(46)
  • Spring Boot集成Graphql快速入门Demo

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。 优势 GraphQL 速度快,并且比较稳定,GraphQL 的操作是在数据层面的,

    2024年04月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包