使用 Laravel 签名的 URL

36 篇文章 0 订阅

WPCMF 开源内容管理系统 

https://gitee.com/wpcmf/wpcmf.git

在一个项目中,您可能需要生成唯一的 URL,这些 URL 执行一些您需要确保用户没有以任何方式更改 URL 的代码。例如,从时事通讯中取消订阅用户,或者为用户创建一个无需密码即可注册的链接,您可能还希望仅为您的电子邮件订阅者提供折扣。

无论您的用例是什么,Laravel 都提供了允许我们使用签名 URL 的功能。

生成签名 URL
要生成签名 URL,我们需要做的第一件事是创建一个命名路由。例如,我将创建一个命名路由,以便在用户单击链接时取消订阅。

// routes/web.php
Route::get('/unsubscribe/{user}', [SubscriptionsController::class, 'unsubscribe'])
       ->name('unsubscribe');


现在,要生成签名 URL,我们可以使用 URL 

use Illuminate\Support\Facades\URL;

return URL::signedRoute('unsubscribe', ['user' => 1]);


该signedRoute方法的第一个参数是路由的名称。这里我使用的是unsubscribed因为这是我们在上面给路由指定的名称,第二个参数是我们要传递给路由的路由参数,在本例中是用户 ID。此方法将返回一个类似这样的 URL:

https://yoursite.com/unsubscribe/1?signature=7594beb1a7af889d997eedc50f68eadb8b2e8d4097ba3a9ff1c600ffa8a02e49

正如你所看到的,Laravelsignature使用散列附加了一个参数到 URL,这表示 URL,因此如果用户修改该 URL 的任何部分,散列将无效。

临时签名的 URL
您可能还想创建一个在一段时间后过期的 URL,您也可以使用temporarySignedRoute方法创建这种类型的 URL

return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['user' => 1]
);


这个方法的第二个参数是 URL 应该过期的时间,使用这个方法expires会在 URL 中添加一个参数,Laravel 会报告这个 URL 无效。

验证 URL
我们现在已经创建了签名 URL,但到目前为止,我们还没有验证哈希。为此,我们可以signed在路由中使用内置的中间件。为此,只需在您的路由声明中添加中间件。

// routes/web.php
 

Route::get('/unsubscribe/{user}', [SubscriptionsController::class, 'unsubscribe'])
       ->name('unsubscribe')
       ->middleware('signed');


通过添加这个中间件,Laravel 将自动检查哈希并抛出 403 HTTP 代码。

个性化错误页面。
您可能还想自定义当 URL 无效时用户看到的错误。这可以通过为 定义自定义可渲染闭包来实现InvalidSignatureException:

// app\Exceptions\Handler.php
use Illuminate\Routing\Exceptions\InvalidSignatureException;
 
/**
 * Register the exception handling callbacks for the application.
 *
 * @return void
 */
public function register()
{
    $this->renderable(function (InvalidSignatureException $e) {
        return response()->view('error.link-expired', [], 403);
    });
}


在这个闭包中,我们可以定义用户在访问无效的单点 URL 时会看到什么。

在没有中间件的情况下验证 URL
在某些情况下,您可能需要验证控制器中的 URL。您可以通过从路由定义中删除singed中间件来做到这一点,而是hasValidSignature在请求中使用。

public function unsubscribe(Request $request)
{
    if (!$request->hasValidSignature()) {
        abort(401);
    }
    
    //...
}


如果我们需要自定义体验,这可以提供更多的灵活性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rorg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值