使用GraphQL Shield与GraphQL Nexus构建安全的API服务

使用GraphQL Shield与GraphQL Nexus构建安全的API服务

graphql-shield 🛡 A GraphQL tool to ease the creation of permission layer. graphql-shield 项目地址: https://gitcode.com/gh_mirrors/gra/graphql-shield

项目概述

GraphQL Shield是一个强大的GraphQL权限控制库,它可以帮助开发者为GraphQL API添加细粒度的访问控制层。本文将通过一个实际示例,展示如何将GraphQL Shield与GraphQL Nexus(一个用于构建GraphQL模式的代码优先框架)结合使用,创建一个安全的用户认证系统。

技术栈介绍

这个示例项目使用了以下核心技术:

  1. GraphQL Shield - 提供权限中间件层
  2. GraphQL Nexus - 用于构建GraphQL模式的代码优先方法
  3. Prisma - 作为数据访问层
  4. Express - 作为HTTP服务器
  5. Cookie认证 - 用于用户会话管理

核心功能实现

认证机制设计

项目采用了基于cookie的认证流程:

  1. 用户通过loginsignup突变获取认证
  2. 服务器设置包含用户ID的HTTP-only cookie
  3. 后续请求通过中间件解析cookie并验证用户身份
  4. GraphQL Shield根据用户认证状态控制API访问

权限规则配置

项目中定义了两个主要的权限规则:

  1. isAuthenticated - 验证用户是否已登录
  2. isAdmin - 验证用户是否具有管理员权限

这些规则被应用于GraphQL模式中的各个操作,确保只有授权用户才能访问特定数据。

环境搭建指南

前置条件

在开始之前,请确保你的开发环境中已安装:

  1. Node.js和包管理器(npm或yarn)
  2. Docker和Docker Compose
  3. Prisma CLI工具

项目初始化步骤

  1. 安装项目依赖:

    yarn install
    
  2. 启动Docker容器运行数据库:

    docker-compose up -d
    
  3. 部署Prisma服务:

    prisma deploy
    
  4. 配置环境变量:

    • 复制.env.example.env
    • 设置APP_SECRET用于JWT签名
  5. 启动开发服务器:

    yarn start:dev
    

使用示例

用户注册与登录

项目提供了两个无需认证的突变操作:

# 用户登录
mutation LOGIN {
  login(data: { email: "test@email.com", password: "bananas" }) {
    id
  }
}

# 用户注册
mutation SIGNUP {
  signup(
    data: {
      email: "test@email.com"
      password: "bananas"
      name: "Monkey Business"
    }
  ) {
    id
  }
}

受保护的查询

成功登录后,用户可以访问以下受保护的查询:

# 获取当前用户信息
query ME {
  me {
    id
    email
    name
  }
}

# 获取所有用户列表
query USERS {
  users {
    id
    email
    name
  }
}

开发注意事项

  1. GraphQL Playground配置:在测试API时,需要将GraphQL Playground的request.credentials设置从omit改为same-origin,以便Playground能够发送cookie。

  2. 认证中间件:项目使用了cookie-parser和自定义的authorization中间件来处理用户认证。

  3. 权限控制:所有查询默认受到保护,只有loginsignup突变可以匿名访问。

技术实现细节

GraphQL Shield集成

在GraphQL Nexus中集成Shield的方式非常直观:

  1. 首先定义权限规则
  2. 然后将这些规则应用到相应的GraphQL类型和字段上
  3. 最后将Shield中间件添加到GraphQL服务器

权限规则示例

const isAuthenticated = rule()(async (parent, args, ctx) => {
  return ctx.userId !== null;
});

const permissions = shield({
  Query: {
    "*": isAuthenticated,
  },
  Mutation: {
    login: not(isAuthenticated),
    signup: not(isAuthenticated),
    "*": isAuthenticated,
  },
});

这种配置方式既灵活又直观,可以轻松扩展以满足复杂的业务需求。

总结

通过结合GraphQL Shield和GraphQL Nexus,开发者可以构建出既安全又易于维护的GraphQL API。这种组合提供了:

  1. 清晰的权限定义方式
  2. 灵活的规则组合能力
  3. 与现有GraphQL生态系统的无缝集成
  4. 优秀的开发者体验

对于需要严格权限控制的GraphQL项目,这种技术组合无疑是一个强大的解决方案。

graphql-shield 🛡 A GraphQL tool to ease the creation of permission layer. graphql-shield 项目地址: https://gitcode.com/gh_mirrors/gra/graphql-shield

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌宣广

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值