在您的Supabase API中实现用户级别认证 - Supaweek第二天 | Zuplo博客

作者:API传播员 · 2025-11-05 · 阅读时间:4分钟
本文详细介绍了如何在Supabase API中通过Zuplo API网关实现用户级别认证,使用API密钥元数据添加orgId字段,并在请求处理程序中根据用户组织标识过滤数据。教程涵盖数据库修改、请求处理程序调整和实际测试步骤,确保API安全性和灵活性。

在Supabase API中实现用户级别认证

在Supaweek的第一天,我们已经学习了如何使用 OpenAI 和 Supabase 数据库作为后端,创建一个基于 AI 的 API,并通过 Zuplo 的 API 网关添加身份验证和速率限制功能,还在网关中编写了请求处理程序。今天,我们将进一步探讨如何在 API 中动态处理用户请求,实现用户级别的身份认证。


用户级别认证的必要性

为 API 设置身份验证层是确保其安全性的关键步骤。然而,随着系统的复杂化,我们可能会面临一个问题:如何根据不同用户的身份,以不同的方式处理 API 请求?

通常情况下,如果使用 JWT(JSON Web Token),可以将声明(claims)添加到令牌中,然后通过编程来处理这些声明。然而,Zuplo 的默认身份验证机制是基于 API 密钥的,而 API 密钥只是一个不透明的短字符串。那么,如何在这种情况下实现用户级别的差异化处理呢?


API密钥的灵活性与定制化

Zuplo 提供了一种灵活的 API 密钥机制,使其既简单易用,又具备高度的定制化能力。我们将在今天的教程中展示如何通过 API 密钥实现用户级别认证。

在本教程中,我们将基于第一天创建的 API 继续构建,确保您已经部署并准备好开始。


在API中添加用户组织标识(orgId)

我们将通过以下步骤为 API 添加用户组织标识(orgId),并基于此标识过滤用户请求:

  1. 在数据库中添加orgId字段
    在 Supabase 数据库的 blogs 表中添加一个名为 orgId 的列,更新后的表结构如下所示:

    ALTER TABLE blogs ADD COLUMN orgId INTEGER;
  2. 修改请求处理程序
    对于 GETPOST 操作,我们需要修改请求处理程序,根据用户的 orgId 来过滤请求。

    Zuplo 会将 API 密钥的元数据填充到 request.user 对象中,因此我们可以通过 request.user.data?.orgId 提取 orgId。如果用户未通过身份验证,request.user 对象将为 undefined

    示例:GET 请求处理程序

    const url = ${env.SUPABASE_URL}/rest/v1/blogs?orgId=eq.${request.user.data?.orgId};

  3. 创建 API 密钥并添加元数据
    在 Zuplo 的项目设置中,导航到 API 密钥使用者 > 添加新使用者,创建一个新的 API 密钥,并在元数据中添加 orgId 字段。此时,您可以将管理器字段留空。

    生成的 API 密钥需要保存下来,因为后续步骤中会用到。


测试用户级别认证功能

创建博客(POST 操作)

使用测试控制台,通过 POST 操作创建一个博客:

  1. 在请求头中添加 API 密钥:

    Authorization: Bearer zpka_134
  2. 设置请求正文:

    {
     "topic": "your blog topic"
    }
  3. 点击 测试 按钮,完成请求。


根据用户组织标识过滤博客(GET 操作)

通过 GET 操作发出请求,API 将根据用户的 orgId 返回对应的博客数据。例如:

[
  {
    "id": 2,
    "orgId": 2,
    "created_at": "2023-09-06T18:01:12.774955+00:00",
    "content": "驾驶很难。",
    "title": "探索不同的视角"
  }
]

如果使用具有不同 orgId 的 API 密钥发出请求,则会返回一个空数组。


总结

通过在 API 密钥中添加 orgId 并在请求处理程序中根据该标识过滤请求,我们成功实现了用户级别的身份认证。这种方法不仅充分利用了 Zuplo 的 API 密钥机制,还确保了系统的灵活性和安全性。

接下来,请关注 Supaweek 第三天的内容,我们将探讨如何使用 Zuplo API 自动生成 API 文档!

原文链接: https://zuplo.com/blog/2023/09/26/handling-user-requests-dynamically