使用JWT保护Laravel API - Okta开发者指南
随着单页应用程序(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)。
- 初始化项目:将项目文件夹切换到目标目录,并安装所需依赖。
- 配置数据库:在
.env文件中,将DB_CONNECTION环境变量设置为sqlite,并删除其他DB_相关变量。 - 创建模型和迁移文件:使用Laravel Artisan命令生成新的模型和迁移文件。
- 配置模型属性:在
app/Models/Location.php中,添加$fillable属性以允许批量分配“名称”和“期望值”字段。 - 更新迁移文件:在迁移文件的
up()方法中,定义name和desirement字段。 - 运行迁移:使用Artisan命令提交迁移到数据库。
- 添加种子数据:在
database/seeds/DatabaseSeeder.php中添加默认数据,并通过Artisan命令运行种子程序。
完成以上步骤后,您的Laravel应用程序、数据库表和模型已准备就绪,接下来可以添加API端点。
添加和测试API端点
在生产环境中,建议将API的业务逻辑封装到控制器中。但在本教程中,我们直接在routes/api.php文件中定义路由。
-
定义路由:
GET /api/locations:返回所有位置。POST /api/locations:创建一个新位置。DELETE /api/locations/{id}:删除指定位置。
-
启动服务器:运行本地Laravel服务器,测试上述端点。
至此,API端点已经设置完成,接下来将为其添加JWT身份验证。
添加Okta JWT验证器
中间件是实现自定义身份验证和请求验证逻辑的理想位置。在本节中,我们将创建一个新的Laravel中间件,利用Okta JWT验证器确保用户提供了有效的JWT。
- 安装依赖:使用Composer安装Okta JWT验证器包及其依赖。
- 配置Okta应用:
- 登录Okta账户,导航至“API > 授权服务器”,复制
Issuer URI并添加到.env文件中。 - 创建一个新的服务型应用,获取
Client ID和Client Secret,并将其添加到.env文件中。
- 登录Okta账户,导航至“API > 授权服务器”,复制
- 创建中间件:使用Artisan命令生成新的中间件文件
VerifyJwt。 - 配置中间件:
- 在
app/Http/Middleware/VerifyJwt.php中实现JWT验证逻辑。 - 在
app/Http/Kernel.php中注册中间件。 - 在
routes/api.php中将中间件应用到相关路由。
- 在
完成以上步骤后,重新启动Laravel应用程序并测试端点。此时,若请求中未包含有效的JWT,API将返回“401未授权”响应。
发布JWT
在使用JWT对用户进行身份验证之前,需要在Okta中创建一个自定义范围(Scope)以提供访问权限。
- 创建自定义范围:
- 在Okta开发者控制台中,导航至“API > 授权服务器”,编辑授权服务器。
- 添加一个新的范围,例如
locations_api。
- 获取访问令牌:
- 使用
curl命令,通过客户端凭据授权获取访问令牌。 - 替换命令中的占位符为实际的
Client ID和Client Secret。
- 使用
- 测试API:
- 在请求的
Authorization头中添加JWT作为承载令牌。 - 测试
GET、POST和DELETE端点,验证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
最新文章
- OWASP API安全十大风险简介 – Graylog
- 使用Gateway API访问Kafka – Strimzi
- 如何测试实时视频流API性能 – FastPix
- 如何用 OpenAPI 在 Express 中构建更好的 API
- 使用 Intersection Observer API 实现懒加载 – LogRocket 博客
- API在社交媒体中的应用
- 实战拆解:如何使用 ChatGPT Agent 实现自动化多步骤任务
- 使用AI进行API设计
- 深入解析API Gateway:微服务架构中的关键组件及其重要功能
- 如何获取巴法云开放平台 API Key 密钥(分步指南)
- 没有中国银行卡怎么用微信支付?探索国际用户的支付新思路
- Python字典(dict)完全指南