halfpetal/hashed-passport

此包已被废弃且不再维护。未建议替代包。

将 Laravel Passport 的默认递增整数 client_id 转换为行业标准唯一哈希字符串。可选地,您可以使用加密客户端密钥以提高安全性。该包非侵入式。详见README。

v7.0.1 2019-02-04 00:10 UTC

This package is auto-updated.

Last update: 2021-11-06 03:20:02 UTC


README

哈希护照将 Passport 的公共客户端 ID 从这个

client_id: 1

转换为更令人愉悦、美观且符合行业标准的

client_id: AE20JvpmdYx34wD789Lng5jyqelQar8R

而不会触及任何核心 Passport 文件。它使用中间件解码路由上的 client_id,并使用观察者使哈希 ID 可通过应用程序中 \Laravel\Passport\Clientclient_id 参数在任何地方可用。

客户端密钥的加密是可选的。这些默认以纯文本保存。启用此功能后,Hashed Passport 将数据库条目 wOVl4sBrTU46KwaiV56yc9IftikEIcKfWYCpwosG 转换为

eyJpdiI6IkhDQlYyZDBpeUVCVHRsZGFcL3ZiejRBPT0iLCJ2YWx1ZSI6InFoUGRKcUFRaVwvc2t3Q1ZhVHhqM3lpaW05cm1FaXpObUtyNmd4QXNMU21mVmNhNW45N0lVTHJLa2prYlJpcmpnQzJqMTRXS1c3NWlaR2tcL01ZZmFNXC9RPT0iLCJtYWMiOiJhYzJmOTMwZWE2NTI4MWZiMTAxNDg5NTQ2NmFiNDU2YmZmOTcxOTIzMTVmNTU2Njk1N2ZlNzg5MzFiNmI5MTUzIn0=

简介

这个包的构想源于我开始使用 Laravel Passport 时。在制作了一些使用 Lumen 和 JWT 的 API 之后,发现 Passport 使用自增整数作为客户端 ID 实在令人震惊。

优点和缺点都在这个2年前的问题中列出。你可以通过查看问题 ID 来判断它的历史有多么悠久 ;-)

原始 Laravel/Passport Github 线程

变更日志

  • 1.0 - 非侵入式实现哈希 Passport 客户端 ID。
  • 1.1 - 非侵入式实现加密 Passport 客户端密钥。
  • 1.2 - 添加了自定义哈希盐选项,清理了代码并改进了README。

要求

可选:加密密钥

  • 支持 VARCHAR(2048) 的数据库。如果您使用 MySQL,则意味着版本 5.0.3+。

安装

哈希客户端 ID
  • 通过 composer 安装 composer require halfpetal/hashed-passport

就这样!如果您没有修改过任何默认的 Laravel Passport 路由,那么您已经设置好了。

可选:加密密钥
  • HashedPassport::withEncryption(); 添加到您的 AppServiceProvider 的 register 方法中。

  • 运行 php artisan migrate

  • 运行 php artisan hashed_passport:install

好了!您的密钥现在已加密存储,并在数据库检索后自动解密。

可选:覆盖 APP_KEY 哈希盐
  • 运行 php artisan vendor:publish --provider="Halfpetal\HashedPassport\HashedPassportServiceProvider"

现在更新 config/hashed-passport.php 中的 salt 键为自定义字符串。

进一步使用和定制

在任何访问 Laravel\Passport\Client 模型的地方,都会提供一个 client_id 参数。这是哈希客户端 ID。

向其他路由添加中间件

安装后,/oauth/token 路由现在将接受传入请求中的哈希 id 和常规整数 id。

要将此功能添加到任何其他路由,只需像这样附加 hashed_passport 中间件

Route::get('/oauth/clients', '\Laravel\Passport\Http\Controllers\ClientController@update')->middleware(['hashed_passport']);

传入的哈希 client_id 字符串现在将自动转换为它的整数值,然后再由应用程序进一步处理。

更改哈希盐

默认情况下,哈希盐是 APP_KEY。要覆盖此行为,发布配置文件以设置自定义盐

php artisan publish:config

它如何工作

哈希 ID

为了开箱即用,该软件包覆盖了 oAuth2 令牌路由,以接受 Client ID 作为哈希字符串。此外,由于 ClientObserver 的存在,哈希客户端 ID 通过 client_id 参数在所有客户端模型中可用。此相同的 ClientObserver 负责加密和解密客户端密钥(如果启用)。

哈希 ID 仍然基于 oauth_clients 表的 index 列。它所做的只是将那个丑陋的整数转换成一个美丽的哈希字符串,就像灰姑娘一样。

为此,向 Hashids 添加了一个新的连接,称为 client_id。此盐基于您的 APP_KEY(除非另行配置)。

支持的授权类型

password: 已验证

client_credentials: 已验证

authorization_code: 未测试(可能需要添加到其他路由的中间件)

加密密钥

与哈希 ID 类似,观察者会在从数据库保存和检索 Client 时捕获它。

由于默认的 VARCHAR(100) 值对于存储较长的加密密钥来说是不够的,因此需要将其更新为 VARCHAR(2048)。它可以更少,但我宁愿安全起见。实际的最大列字符长度对存储使用没有影响。

然后运行 php artisan hashed_passport:install 以加密所有现有行,使其密钥被加密。一旦成功,您将看到一个大的锁。从现在起,您所有的客户端密钥都将安全地使用 Laravel 的 encrypt() 辅助函数存储。

故障排除

  • 该软件包应与任何安装兼容,甚至可以与使用生产中的整数客户端 id 的项目一起使用,因为它将支持客户端 id 的两个版本并加密所有客户端的密钥。

  • 检查您的路由以确保 /oauth/token 使用 hashed_passport 中间件: php artisan route:list。这同样适用于您希望接受具有哈希 client_id 的请求的任何其他路由。

卸载

如果将来在 Laravel Passport 中添加了哈希 ID 和加密密钥的支持,要恢复到正常,您需要执行以下步骤

运行 php artisan hashed_passport:uninstall 以将数据库中的密钥恢复为纯文本。

运行 composer remove halfpetal/hashed-passport 以删除该软件包。

从您的 AppServiceProvider 中移除 HashedPassport::withEncryption();

运行以下 SQL 命令 DELETE FROM 'migrations' WHERE migration LIKE '%hashed_passport%' 以更新您的迁移表并防止回滚错误。尽管如此,php artisan migrate:refresh 仍将正常工作。

反馈

这是我第一个包,如果您有任何反馈,请留言!学习如何创建包为Laravel这个奇迹般的框架打开了一个全新的欣赏视角。

欢迎提交改进功能或修复任何错误的拉取请求。

致谢

感谢 @hfmikep@nikkuang 作为第一个正确处理这个长期功能请求的人。再次感谢 @hfmikepUnHashClientIdOnRequest 中间件创建了代码。还要感谢 @corbosman 提出客户端密钥加密的需求。

许可证

版权所有 (c) 2018 Stan Smulders

MIT 许可证

以下条件下,任何获得此软件及其相关文档文件(“软件”)副本的人(“个人”)被授予免费处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许软件接收人进行此类操作:

所有副本或软件的大量部分均应包含上述版权声明和本许可声明。

本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵犯版权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类责任是基于合同、侵权或其他方式,无论是在软件或软件的使用或其他交易中产生的。