Auth :: логин не авторизируется на вновь созданном пользователе - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь разрешить пользователям входить на мой сайт, используя поток OAuth Twitch. Целая загрузка токена доступа и последующих пользовательских данных работает, но я также хочу сохранить некоторые пользовательские данные в своей базе данных, чтобы я мог назначать роли определенным людям. После успешной выборки пользовательских данных, я получил следующий код в HomeController

public function redirect(Request $request): RedirectResponse
{
    // fetch data

    $this->authService->authenticateUser($response, $this->userRepository);

    return redirect()->route('index');
}

authenticateUser()

public function authenticateUser(array $response, UserRepositoryInterface $userRepository): void
{
    $data = $response['content']->data[0];

    $user = $userRepository->findByTwitchId($data->id);

    if (!$user) {
        $user = $userRepository->create($data);
    }

    Auth::login($user);
}

Две функции хранилища также довольно просты;

findByTwitchId()

public function findByTwitchId(string $twitchId): ?User
{
    return User::where('twitch_id', $twitchId)->first();
}

create()

public function create($data): User
{
    return User::create([
        'twitch_id' => $data->id,
        'login_name' => $data->login,
        'display_name' => $data->display_name,
        'email' => $data->email,
        'profile_image' => $data->profile_image_url
    ]);
}

User модель

class User extends Authenticatable
{
    use Notifiable;
    use HasRoles;

    protected $guarded = [];

    protected $keyType = 'string';

    protected $primaryKey = 'twitch_id';
}

Все до Auth::login($user) в authenticateUser работает. Если пользователь уже существует, этот пользователь возвращается, в противном случае создается новый пользователь, и этот пользователь возвращается.

Однако я не могу заставить Auth::login($user) работать с вновь созданным пользователем. Только когда пользователь проходит через поток входа во второй раз (например, когда пользователь уже был сохранен в базе данных), вход в систему работает. Что еще более странно, когда я добавляю dd(Auth::check()) ниже Auth::login(), он возвращает true, но когда я впоследствии делаю ту же самую проверку в HomeController@index (куда пользователь перенаправляется после входа в систему), он возвращает false.

Я, честно говоря, заблудился, почему он не работает.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Поскольку я установил protected $primaryKey в неинкрементное значение (twitch_id), мне пришлось добавить public $incrementing = false к моей User модели, как объяснено в этой публикации.

0 голосов
/ 27 февраля 2020

распечатайте ваш $ user в обоих случаях для нового и существующего. давайте проверим, если что-то отсутствует у нового пользователя перед функцией Auth :: login ($ user).

public function authenticateUser(array $response, UserRepositoryInterface $userRepository): void
    {
        $data = $response['content']->data[0];

        $user = $userRepository->findByTwitchId($data->id);

        if (!$user) {
            $user = $userRepository->create($data);
        }


        Auth::login($user);
    }
...