我有一个仍在开发中的应用程序,但它已经部署并运行在服务器上。为了保护它不被引导者或不应该看到它的人访问,我通过服务器配置仪表板(我使用 runcloud)而不是 Laravel 本身启用了基本身份验证。
这一切都工作正常,但由于该应用程序集成了支付功能,我必须实现
POST
路线(webhook),以便外部支付提供商在需要确认付款时点击它。此单一路由不应落后于基本身份验证,否则支付提供商将获得 HTTP 401
。
所以我有:
auth.basic
中间件添加到除 webhook 之外的所有路由中,在 Laravel 级别启用基本身份验证。 Route::post('/payments/verify', [PaymentsController::class, 'verify'])
->name('payments.verify')
->withoutMiddleware('auth.basic');
这也有效,但默认情况下,Laravel 将使用
users
表中的电子邮件和密码作为凭据。 我不想要这个。我想要为每个人提供固定且简单的凭据,例如“foo”/“bar”。
我如何在 Laravel 11 中做到这一点?
好的,所以我决定使用中间件来处理它,并且我的云管理软件提供临时域,所以我创建了一个中间件作为我的生产域的别名,然后我定义了以下类:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class ServeOverTemporaryDomain
{
public function handle(Request $request, Closure $next): Response
{
if (app()->isProduction() && $request->getHost() === config('app.temporary_domain')) {
return $next($request);
}
if (app()->isProduction() && $request->getHost() === 'my-production-domain.eu') {
die; // yep, I simply kill the request
}
return $next($request);
}
}
和:
->withMiddleware(function (Middleware $middleware): void {
$middleware->append(ServeOverTemporaryDomain::class);
其中
config('app.temporary_domain')
是 'temporary_domain' => env('APP_TEMPORARY_DOMAIN'),
,它指向:
APP_TEMPORARY_DOMAIN=temp.foobar.temp-site.link
在我的 .env.
文件中。
这样,当到达公共已知域时,没有人可以看到任何东西,但没有人知道临时值。 url 下的应用程序和 webhook 都照常工作。