halfpetal / hashed-passport
将 Laravel Passport 的默认递增整数 client_id 转换为行业标准唯一哈希字符串。可选地,您可以使用加密客户端密钥以提高安全性。该包非侵入式。详见README。
Requires
- doctrine/dbal: ^2.6
- laravel/passport: ^7.0
- vinkla/hashids: ^5.0
README
哈希护照将 Passport 的公共客户端 ID 从这个
client_id: 1
转换为更令人愉悦、美观且符合行业标准的
client_id: AE20JvpmdYx34wD789Lng5jyqelQar8R
而不会触及任何核心 Passport 文件。它使用中间件解码路由上的 client_id,并使用观察者使哈希 ID 可通过应用程序中 \Laravel\Passport\Client 的 client_id 参数在任何地方可用。
客户端密钥的加密是可选的。这些默认以纯文本保存。启用此功能后,Hashed Passport 将数据库条目 wOVl4sBrTU46KwaiV56yc9IftikEIcKfWYCpwosG 转换为
eyJpdiI6IkhDQlYyZDBpeUVCVHRsZGFcL3ZiejRBPT0iLCJ2YWx1ZSI6InFoUGRKcUFRaVwvc2t3Q1ZhVHhqM3lpaW05cm1FaXpObUtyNmd4QXNMU21mVmNhNW45N0lVTHJLa2prYlJpcmpnQzJqMTRXS1c3NWlaR2tcL01ZZmFNXC9RPT0iLCJtYWMiOiJhYzJmOTMwZWE2NTI4MWZiMTAxNDg5NTQ2NmFiNDU2YmZmOTcxOTIzMTVmNTU2Njk1N2ZlNzg5MzFiNmI5MTUzIn0=
简介
这个包的构想源于我开始使用 Laravel Passport 时。在制作了一些使用 Lumen 和 JWT 的 API 之后,发现 Passport 使用自增整数作为客户端 ID 实在令人震惊。
优点和缺点都在这个2年前的问题中列出。你可以通过查看问题 ID 来判断它的历史有多么悠久 ;-)
变更日志
- 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 作为第一个正确处理这个长期功能请求的人。再次感谢 @hfmikep 为 UnHashClientIdOnRequest 中间件创建了代码。还要感谢 @corbosman 提出客户端密钥加密的需求。
许可证
版权所有 (c) 2018 Stan Smulders
MIT 许可证
以下条件下,任何获得此软件及其相关文档文件(“软件”)副本的人(“个人”)被授予免费处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许软件接收人进行此类操作:
所有副本或软件的大量部分均应包含上述版权声明和本许可声明。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵犯版权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类责任是基于合同、侵权或其他方式,无论是在软件或软件的使用或其他交易中产生的。