【发布时间】:2022-12-03 11:44:30
【问题描述】:
我有一个带有标准用户表的 Laravel 应用程序,我正在实现 Auth0 登录。登录时,将使用给定的电子邮件在数据库中创建用户记录。
我有一个 CustomUserRepository.php 文件:
<?php
namespace App\Repositories;
use App\Models\User;
use Illuminate\Contracts\Auth\Authenticatable;
class CustomUserRepository implements \Auth0\Laravel\Contract\Auth\User\Repository
{
public function fromSession(array $user): ?\Illuminate\Contracts\Auth\Authenticatable
{
return User::firstOrCreate(['email' => $user['email']]);
}
public function fromAccessToken(array $user): ?\Illuminate\Contracts\Auth\Authenticatable
{
// Simliar to above. Used for stateless application types.
return null;
}
public function getUserByUserInfo(array $userinfo) : Authenticatable
{
$user = $this->upsertUser( $userinfo['profile'] );
return new Auth0User( $user->getAttributes(), $userinfo['accessToken'] );
}
protected function upsertUser($profile)
{
return User::firstOrCreate(
[
'sub' => $profile['sub']
],
[
'email' => $profile['email'] ?? '',
'name' => $profile['name'] ?? '',
]
);
}
}
还有我的 auth.php 文件:
<?php
return [
'defaults' => [
'guard' => 'auth0',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'auth0' => [
'driver' => 'auth0',
'provider' => 'auth0',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'auth0' => [
'driver' => 'auth0',
'repository' => App\Repositories\CustomUserRepository::class
],
],
该应用程序有效。我使用 Auth0 登录,创建了用户,一切都按预期工作,除了测试。
$this->be(User::find(1));
$response = $this->get('/valid-url');
$response->assertStatus(200);
$response = $this->get('/another-valid-url');
$response->assertStatus(200);
在这种情况下,PHPUnit 似乎“忘记”了我对第二个 get() 请求的登录。第一个工作正常,状态 200,一切正常。对于第二个请求(获取或发布),我总是会返回 302 返回登录页面。
我该如何解决这个问题?
【问题讨论】: