Laravel 5.7 Passport不断重定向到登录

时间:2019-02-28 09:57:27

标签: php laravel http-status-code-403 laravel-passport policy

我想构建一个给我特定对象的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')可以防止未登录时达到该策略。


根据this questionthis doc我必须能够将策略中的查看方法从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 :(得分:0)

我现在正在使用Passport。在Postman标头上添加此标签可以解决我的问题。希望这对您也有帮助

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

令牌可以在用户登录时生成。这是我的LoginController

$user = $request->user();

$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;

  if ($request->remember_me)
   {
        $token->expires_at = Carbon::now()->addWeeks(1);
   }

$token->save();

$message = ['user' => $user,
  'access_token' => $tokenResult->accessToken,
  'token_type' => 'Bearer',
  'expires_at' => Carbon::parse(
   $tokenResult->token->expires_at
  )->toDateTimeString()
];

答案 1 :(得分:0)

我解决了Sanjay Chaudhari发表的简单评论!

不使用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而不是通常的Controller。