manchidede/hashed-passport-for-dusterio-lumen-passport

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

2.0 2019-03-04 23:15 UTC

This package is auto-updated.

Last update: 2024-09-15 20:40:57 UTC


README

哈希护照将Passport的公共Client IDs从这样

client_id: 1

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

client_id: AE20JvpmdYx34wD789Lng5jyqelQar8R

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

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

eyJpdiI6IkhDQlYyZDBpeUVCVHRsZGFcL3ZiejRBPT0iLCJ2YWx1ZSI6InFoUGRKcUFRaVwvc2t3Q1ZhVHhqM3lpaW05cm1FaXpObUtyNmd4QXNMU21mVmNhNW45N0lVTHJLa2prYlJpcmpnQzJqMTRXS1c3NWlaR2tcL01ZZmFNXC9RPT0iLCJtYWMiOiJhYzJmOTMwZWE2NTI4MWZiMTAxNDg5NTQ2NmFiNDU2YmZmOTcxOTIzMTVmNTU2Njk1N2ZlNzg5MzFiNmI5MTUzIn0=

简介

这个包的想法起源于我开始使用Laravel Passport的时候。在制作了几个使用Lumen和JWT的API后,发现Passport使用自动递增整数作为Client ID令人惊讶。

优点和缺点都在这个两年前的问题中列出。你可以通过查看问题的ID来知道它有多老了 ;-)

原始Laravel/Passport GitHub线程

变更日志

  • 1.0 - 哈希护照客户端ID的无侵入式实现。
  • 1.1 - 加密护照客户端密钥的无侵入式实现。
  • 1.2 - 添加了自定义哈希盐的选项,清理了代码并改进了readme。
  • 2.0 - 与Laravel Passport 7.0兼容并包含测试。感谢Hackel和其他贡献者。

要求

可选:加密密钥

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

安装

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

这就完成了!如果您没有修改任何默认的Laravel Passport路由,您就设置好了。

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

  • 运行php artisan migrate

  • 运行php artisan hashed_passport:install

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

可选:覆盖APP_KEY哈希盐
  • 运行php artisan vendor:publish --provider="Ssmulders\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令牌路由,以接受作为哈希字符串的客户端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 ssmulders/hashed-passport以移除该包。

从你的AppServiceProvider中删除HashedPassport::withEncryption();

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

反馈

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

请随意提交改进功能或修复任何错误的pull request。

致谢

感谢@hfmikep@nikkuang是第一个正确开始解决这个长期功能请求的人。再次感谢@hfmikep创建了在UnHashClientIdOnRequest中间件中使用的代码。还要感谢@corbosman请求客户端密钥加密。

许可协议

版权所有 (c) 2018 Stan Smulders

MIT许可协议

特此授予任何人获得本软件及其相关文档文件(以下简称“软件”)副本的许可,免费使用软件,包括但不限于使用、复制、修改、合并、发布、分发、许可和/或销售软件副本的权利,并允许向软件提供者提供软件的人进行此类操作,但须遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

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