Laravel 5.7 Passport продолжает перенаправлять на логин - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу создать конечную точку API, которая дает мне определенный объект.Некоторые объекты являются общедоступными, некоторые могут быть просмотрены только владельцем этого объекта, пока они не опубликуют объект.

Route::get('jobs/{job}', 'JobController@find')->middleware('auth:api');

JobPolicy должен решить, что должно произойти:

public function view(User $user, Job $job)
{
    if (!empty($user)) {
        return $job->user_id === $user->id || $job->job_status_id !== 1;
    }
    return true;
}

Это работает, когда пользователь вошел в систему. Когда пользователь не вошел, это больше не работает.

Таким образом, ->middleware('auth:api') предотвращает доступ к Политике, когда не вошел в систему.


Согласно этому вопросу и этому документу Я должен иметь возможность изменить метод представления в Политике с view(User $user, Job $job) на view(?User $user, Job $job), чтобы иметьДостигнута политика даже для неаутентифицированных пользователей.

Проблема в том, что из-за ->middleware('auth:api') он продолжает посылать меня на app\Exceptions\Handler.php с ошибкой без аутентификации.

Ясно добавляя ? для JobPolicy - не единственное, что я должен делать.


Я использую PHP 7.2, Laravel 5.7 и Laravel Passport 7.2.0.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я решил благодаря простому комментарию, опубликованному Санджаем Чаудхари!

Неиспользование auth:api вызвало новую проблему.Таким образом, политики будут требовать Auth::user() вместо auth()->guard('api')->user().Поскольку я проходил аутентификацию с помощью токена, Auth::user() был бы пустым.

Я сделал общий ApiController, который выполняет следующее:

class ApiController extends Controller {
    /**
     * Return the logged in user
     *
     * @return mixed
     */
    public function getUser() {
        return Auth::user() ?? auth()->guard('api')->user();
    }

    public function authorize($ability, $arguments = [])
    {
        return $this->authorizeForUser($this->getUser(), $ability, $arguments);
    }
}

И разрешил все мои контроллеры, связанные с API.расширить ApiController вместо обычного контроллера.

0 голосов
/ 28 февраля 2019

Сейчас я использую паспорт.Добавление этого в заголовки Postman решило мою проблему.Надеюсь, вам это тоже поможет

Key                      Value
===================================
Accept             application/json
Authorization      Bearer {insert_token_login_here}

Маркер может быть сгенерирован, когда пользователь вошел в систему.

...