Laravel url 如何生成一个临时的,点一次就失效的那种?

比如用户邮箱注册后,发一个验证url,然后用户点击一次后就失效这种效果,有没有这种功能的?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4

这个很简单,在生成验证token后,把token传入cache(如redis或memcache)中,在点击验证URL后,跳转验证路由,如果cache中有这个key,验证通过,然后从cache中forget掉这个key就行了

4年前 评论
donggan (楼主) 4年前
malphitee (作者) 4年前
malphitee (作者) 4年前

Laravel 自带了 verified 的中间件。
如果没验证邮箱的用户访问一个配置好的路由,就会提示该用户邮箱未激活。

4年前 评论
donggan (楼主) 4年前
g-sabo (作者) 4年前
JeffreyBool

签名 URL

Laravel 允许你轻松地为命名路径创建「签名」URL,这些 URL 在查询字符串后附加了「签名」哈希,允许 Laravel 验证 URL 自创建以来未被修改过。签名 URL 对于可公开访问但需要一层防止 URL 操作的路由特别有用。

例如,你可以使用签名 URL 来实现通过电子邮件发送给客户的公共「取消订阅」链接。要创建指向路径的签名 URL ,请使用 facade 的 signedRoute 方法 URL

use Illuminate\Support\Facades\URL;

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

如果要生成过期的临时签名路由 URL ,可以使用以下 temporarySignedRoute 方法:

use Illuminate\Support\Facades\URL;

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

验证签名路由请求

要验证传入请求是否具有有效签名,你应该调用 hasValidSignature 传入的方法 Request

use Illuminate\Http\Request;

Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }

    // ...
})->name('unsubscribe');

或者,你可以将 Illuminate\Routing\Middleware\ValidateSignature 中间件分配给路由。如果它不存在,则应该在 HTTP 内核的 routeMiddleware 数组中为此中间件分配一个键:

/**
 * 应用程序的路由中间件
 *
 * 这些中间件可能被分配给组或单独使用
 *
 * @var array
 */
protected $routeMiddleware = [
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
];

在内核中注册中间件后,你可以将其附加到路由中。如果传入请求没有有效签名,则中间件将自动返回 403 错误响应:

Route::post('/unsubscribe/{user}', function (Request $request) {
    // ...
})->name('unsubscribe')->middleware('signed');

然后结合 Redis set 的 key 增加一次性查看就好了

4年前 评论
JeffreyBool (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!