在SST项目中实现基于Auth0的JWT授权API开发指南

在SST项目中实现基于Auth0的JWT授权API开发指南

sst.dev Repo for sst.dev sst.dev 项目地址: https://gitcode.com/gh_mirrors/ss/sst.dev

前言

在现代Web应用开发中,身份验证和授权是至关重要的安全机制。本文将详细介绍如何在SST(Serverless Stack)项目中,通过Auth0实现JWT(JSON Web Token)授权机制来保护无服务器API。

技术背景

什么是JWT授权?

JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT常用于身份验证和信息交换,特别适合无服务器架构。

为什么选择Auth0?

Auth0是一个身份验证和授权平台,提供:

  • 多种身份验证方式(社交登录、企业登录等)
  • 完善的用户管理功能
  • 高度可定制的安全策略
  • 易于集成的SDK

环境准备

开始前确保具备以下条件:

  1. Node.js 16或更高版本
  2. TypeScript开发环境
  3. 配置好的AWS账户和CLI
  4. 有效的Auth0账户

项目初始化

首先创建SST基础项目:

npx create-sst@latest --template=base/example api-auth-jwt-auth0
cd api-auth-jwt-auth0
npm install

项目结构说明:

  • stacks/:存放基础设施代码(使用AWS CDK)
  • packages/functions/:存放API业务逻辑代码

Auth0配置步骤

  1. 在Auth0控制台创建新应用
  2. 选择"单页应用"类型
  3. 获取Domain和Client ID并添加到.env文件
  4. 配置回调URL为http://localhost:3000

.env文件示例:

AUTH0_DOMAIN=your-domain.auth0.com
AUTH0_CLIENT_ID=your-client-id

API基础设施搭建

stacks/ExampleStack.ts中定义API资源:

const api = new Api(stack, "Api", {
  authorizers: {
    auth0: {
      type: "jwt",
      jwt: {
        issuer: `https://${process.env.AUTH0_DOMAIN}/`,
        audience: [
          `${process.env.AUTH0_CLIENT_ID}`,
          `https://${process.env.AUTH0_DOMAIN}/api/v2/`,
        ],
      },
    },
  },
  defaults: {
    authorizer: "auth0",
  },
  routes: {
    "GET /private": "functions/private.main",
    "GET /public": {
      function: "functions/public.main",
      authorizer: "none",
    },
  },
});

关键配置说明:

  • issuer:Auth0颁发者URL(注意结尾斜杠)
  • audience:API的预期接收方
  • 定义了两个端点:受保护的/private和公开的/public

业务逻辑实现

公开端点实现

packages/functions/src/public.ts:

export async function main() {
  return {
    statusCode: 200,
    body: "Hello stranger!",
  };
}

受保护端点实现

packages/functions/src/private.ts:

export const main: APIGatewayProxyHandlerV2WithJWTAuthorizer = async (event) => {
  return {
    statusCode: 200,
    body: `Hello ${event.requestContext.authorizer.jwt.claims.sub}!`,
  };
};

前端集成

创建React应用

npx create-vite@latest frontend --template react
cd frontend
npm install

配置Amplify

安装依赖:

npm install aws-amplify @auth0/auth0-react

配置入口文件main.jsx

Amplify.configure({
  API: {
    endpoints: [
      {
        name: "api",
        endpoint: import.meta.env.VITE_APP_API_URL,
        region: import.meta.env.VITE_APP_REGION,
      },
    ],
  },
});

实现登录UI

核心功能组件App.jsx

const App = () => {
  const { loginWithRedirect, logout, user, isAuthenticated } = useAuth0();

  const privateRequest = async () => {
    const accessToken = await getAccessTokenSilently({
      audience: `https://${import.meta.env.VITE_APP_AUTH0_DOMAIN}/api/v2/`,
    });
    const response = await API.get("api", "/private", {
      headers: { Authorization: `Bearer ${accessToken}` },
    });
    alert(JSON.stringify(response));
  };

  return (
    <div className="container">
      {isAuthenticated ? (
        <div>
          <p>Welcome {user.email}</p>
          <button onClick={logout}>Logout</button>
          <button onClick={privateRequest}>Call Private API</button>
        </div>
      ) : (
        <button onClick={loginWithRedirect}>Login</button>
      )}
    </div>
  );
};

开发与测试

启动开发环境:

npm run dev

测试要点:

  1. 未登录时访问公开/私有API的表现
  2. 登录流程是否正常
  3. 登录后访问私有API是否成功
  4. 用户信息是否正确显示

生产部署

部署到生产环境:

npx sst deploy --stage prod

环境隔离说明:

  • devprod是完全隔离的环境
  • 资源名称会自动添加阶段前缀
  • 可以独立管理和维护

安全最佳实践

  1. 始终使用HTTPS
  2. 定期轮换Auth0客户端密钥
  3. 限制API的访问权限
  4. 监控和记录所有API调用
  5. 实现适当的令牌过期策略

常见问题解决

  1. 空白页面问题:在index.html中添加全局变量polyfill
  2. Vite配置问题:确保正确配置运行时变量
  3. 跨域问题:检查Auth0和API的CORS设置
  4. 令牌失效:验证令牌的颁发者和受众是否正确

资源清理

删除开发环境:

npx sst remove

删除生产环境:

npx sst remove --stage prod

总结

通过本教程,我们实现了:

  1. 基于SST的无服务器API架构
  2. 使用Auth0的JWT身份验证
  3. 前后端分离的安全通信
  4. 多环境部署策略

这种方案特别适合需要快速迭代、要求高安全性的现代Web应用开发。Auth0提供的丰富功能可以轻松扩展更多身份验证方式,而SST的无服务器架构则确保了系统的可扩展性和成本效益。

sst.dev Repo for sst.dev sst.dev 项目地址: https://gitcode.com/gh_mirrors/ss/sst.dev

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

甄旖昀Melanie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值