使用JWT保护Laravel API - Okta开发者指南

作者:API传播员 · 2025-11-23 · 阅读时间:6分钟

随着单页应用程序(SPA)的流行和JSON Web令牌(JWT)已经成为一种广泛使用的用户身份验证方式。JWT的独特之处在于,它无需依赖服务器存储用户状态,而是将信息编码在客户端存储的密钥有效载荷中。

JWT的安全性并不逊色于服务器端会话存储,但开发者需要了解其潜在的权衡点,并知道如何应对JWT被泄露的情况。建议开发者定期让JWT过期,并在信任JWT之前始终验证其有效性。

正确使用JWT可以带来多种优势。对于大部分操作在浏览器中完成的单页应用程序,JWT尤为适用。客户端可以解码JWT并验证其签名,从而无需每次都向服务器请求身份验证。此外,JWT也适用于高性能、全球分布式的服务器端应用程序。通过在JWT中存储用户信息,每个节点都可以本地验证用户,而无需频繁查询身份验证服务。


使用JWT身份验证保护Laravel API

在本教程中,我们将使用Okta生成JWT,允许用户安全地调用API。随后,我们会利用Okta的JWT Verifier包验证JWT,以确保用户在访问数据之前持有有效且未过期的令牌。为了简化示例,我们将使用客户端凭据授权,但Okta标准Laravel身份验证返回的JWT同样适用。


设置一个新的Laravel应用程序

在添加API端点和身份验证包之前,首先需要创建一个全新的Laravel应用程序,并设置数据库表和模型。在本教程中,我们将创建一个“Location”(位置)模型和数据库表,用于存储多个位置的名称及其可取性评分(范围为1到10)。

  1. 初始化项目:将项目文件夹切换到目标目录,并安装所需依赖。
  2. 配置数据库:在.env文件中,将DB_CONNECTION环境变量设置为sqlite,并删除其他DB_相关变量。
  3. 创建模型和迁移文件:使用Laravel Artisan命令生成新的模型和迁移文件。
  4. 配置模型属性:在app/Models/Location.php中,添加$fillable属性以允许批量分配“名称”和“期望值”字段。
  5. 更新迁移文件:在迁移文件的up()方法中,定义namedesirement字段。
  6. 运行迁移:使用Artisan命令提交迁移到数据库。
  7. 添加种子数据:在database/seeds/DatabaseSeeder.php中添加默认数据,并通过Artisan命令运行种子程序。

完成以上步骤后,您的Laravel应用程序、数据库表和模型已准备就绪,接下来可以添加API端点


添加和测试API端点

在生产环境中,建议将API的业务逻辑封装到控制器中。但在本教程中,我们直接在routes/api.php文件中定义路由。

  1. 定义路由

    • GET /api/locations:返回所有位置。
    • POST /api/locations:创建一个新位置。
    • DELETE /api/locations/{id}:删除指定位置。
  2. 启动服务器:运行本地Laravel服务器,测试上述端点。

至此,API端点已经设置完成,接下来将为其添加JWT身份验证。


添加Okta JWT验证器

中间件是实现自定义身份验证和请求验证逻辑的理想位置。在本节中,我们将创建一个新的Laravel中间件,利用Okta JWT验证器确保用户提供了有效的JWT。

  1. 安装依赖:使用Composer安装Okta JWT验证器包及其依赖。
  2. 配置Okta应用
    • 登录Okta账户,导航至“API > 授权服务器”,复制Issuer URI并添加到.env文件中。
    • 创建一个新的服务型应用,获取Client IDClient Secret,并将其添加到.env文件中。
  3. 创建中间件:使用Artisan命令生成新的中间件文件VerifyJwt
  4. 配置中间件
    • app/Http/Middleware/VerifyJwt.php中实现JWT验证逻辑。
    • app/Http/Kernel.php中注册中间件。
    • routes/api.php中将中间件应用到相关路由。

完成以上步骤后,重新启动Laravel应用程序并测试端点。此时,若请求中未包含有效的JWT,API将返回“401未授权”响应。


发布JWT

在使用JWT对用户进行身份验证之前,需要在Okta中创建一个自定义范围(Scope)以提供访问权限。

  1. 创建自定义范围
    • 在Okta开发者控制台中,导航至“API > 授权服务器”,编辑授权服务器。
    • 添加一个新的范围,例如locations_api
  2. 获取访问令牌
    • 使用curl命令,通过客户端凭据授权获取访问令牌。
    • 替换命令中的占位符为实际的Client IDClient Secret
  3. 测试API
    • 在请求的Authorization头中添加JWT作为承载令牌。
    • 测试GETPOSTDELETE端点,验证JWT的有效性。

通过上述步骤,Laravel将使用Okta JWT验证器验证令牌的有效性和未过期状态。如果验证通过,API将正常返回数据。


总结

通过本教程,我们学习了如何使用Okta生成和验证JWT,以保护Laravel API的安全性。使用Okta等第三方身份验证提供程序的最大优势在于,它将身份验证与应用逻辑解耦,帮助开发者构建可扩展、分布式且安全的API。

如果您希望进一步了解如何将Okta集成到Laravel和PHP应用程序中,可以参考Okta的官方文档和相关资源。

原文链接: https://developer.okta.com/blog/2020/11/04/protecting-a-laravel-api-with-jwt