cirelramostrabajo / hashed-passport
将Laravel Passport默认的递增整数client_id转换为行业标准唯一哈希字符串。可选地,您可以使用加密客户端密钥来提高安全性。该包是非侵入式的。有关详细信息,请参阅readme。
Requires
- doctrine/dbal: ^2.10
- laravel/passport: ^9.4|^10.1
- vinkla/hashids: ^8.1|^9.1
Requires (Dev)
- mockery/mockery: >=1.3
- orchestra/testbench: ^5.10
- phpunit/phpunit: ^8.5.8|^9.3.3
This package is auto-updated.
Last update: 2024-09-16 20:56:18 UTC
README
哈希护照将Passport的公共Client IDs从以下内容
client_id: 1
转换为更令人愉悦、美观且符合行业标准的
client_id: AE20JvpmdYx34wD789Lng5jyqelQar8R
而不会触及任何核心Passport文件。它使用中间件在路由上解码client_id
,并使用观察者使哈希id可通过应用程序中任何地方的\Laravel\Passport\Client
的client_id
参数获取。
客户端密钥的加密是可选的。这些默认以纯文本形式保存。启用此功能后,哈希护照将数据库条目wOVl4sBrTU46KwaiV56yc9IftikEIcKfWYCpwosG
转换为
以下内容
eyJpdiI6IkhDQlYyZDBpeUVCVHRsZGFcL3ZiejRBPT0iLCJ2YWx1ZSI6InFoUGRKcUFRaVwvc2t3Q1ZhVHhqM3lpaW05cm1FaXpObUtyNmd4QXNMU21mVmNhNW45N0lVTHJLa2prYlJpcmpnQzJqMTRXS1c3NWlaR2tcL01ZZmFNXC9RPT0iLCJtYWMiOiJhYzJmOTMwZWE2NTI4MWZiMTAxNDg5NTQ2NmFiNDU2YmZmOTcxOTIzMTVmNTU2Njk1N2ZlNzg5MzFiNmI5MTUzIn0=
简介
这个包的想法源于我开始使用Laravel Passport的时候。在制作了几个使用Lumen和JWT的API之后,发现Passport使用自增整数作为Client ID,这让我感到震惊。
优点和缺点都列在这个2年前的问题中。你可以通过查看问题的ID来了解它有多老了 ;-)
更新日志
- 1.0 - 哈希Passport客户端ID的非侵入式实现。
- 1.1 - 加密Passport客户端密钥的非侵入式实现。
- 1.2 - 添加了自定义哈希盐的选项,清理了代码并改进了readme。
- 2.0 - 与Laravel Passport 7.0兼容,并包含测试。感谢Hackel和其他贡献者。
要求
可选:加密密钥
- 支持
VARCHAR(2048)
的数据库。如果您使用MySQL,则意味着版本5.0.3+
安装
哈希客户端ID
- 使用composer安装
composer require cirelramostrabajo/hashed-passport
这就完成了!如果您没有修改过任何默认的Laravel Passport路由,那么您就设置好了。
可选:加密密钥
-
将
HashedPassport::withEncryption();
添加到您的AppServiceProvider
的register方法中。 -
运行
php artisan migrate
-
运行
php artisan hashed_passport:install
好了!您的密钥现在已加密存储,并在从数据库检索后自动解密。
可选:覆盖APP_KEY哈希盐
- 运行
php artisan vendor:publish --provider="Cirelramostrabajo\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)
值对于存储较长的加密密钥的 secret
列不足,因此需要将其更新为 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 cirelramostrabajo/hashed-passport
以删除包。
从您的 AppServiceProvider
中删除 HashedPassport::withEncryption();
运行此 SQL 命令 DELETE FROM 'migrations' WHERE migration LIKE '%hashed_passport%'
以更新您的迁移表并防止回滚错误。虽然 php artisan migrate:refresh
将正常工作。
反馈
这是我第一个包,如果您对任何内容有任何反馈,请留言!学习如何创建包使我对 Laravel 的奇妙之处有了全新的认识。
请随意提出改进功能或修复任何错误的拉取请求。
致谢
感谢 @hfmikep 和 @nikkuang 首先正确地着手处理这个长期以来的功能请求。再次感谢 @hfmikep 为 UnHashClientIdOnRequest
中间件创建了代码。还要感谢 @corbosman 提出客户端密钥加密请求。
许可协议
版权所有 (c) 2018 Stan Smulders
MIT 许可协议
以下条件允许任何人免费获得此软件及其相关文档副本("软件"),在不限制包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供者提供软件的人这样做,前提是遵守以下条件:
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按“现状”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于适销性、针对特定目的的适用性和非侵权性。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论该责任是基于合同、侵权或其他方式,是否由软件或其使用或其他方式产生。