处理Laravel中未经授权的用户

时间:2019-05-12 19:11:31

标签: php laravel rest restful-authentication

我正在尝试使用Laravel创建REST API。我正在使用JWT(Tymon \ JWTAuth)对用户进行身份验证。

这是我的api.php文件的一部分,带有/ api路由:

Route::middleware('auth:api')->get("match/{id}", "ApiMatchController@getMatch");
Route::middleware('auth:api')->put("match/{id}", "ApiMatchController@editMatch");

现在,我正在将GET请求发送到/api/match/7。授权用户将按预期获得比赛详细信息。未经授权的用户被重定向到根URL /,但是我希望用户保留在该URL上,我只想返回HTTP代码401-未经授权。我在哪里可以更改?我可以在ApiMatchController@getMatch方法中执行此操作,但我希望中间件auth:api为我执行此操作。有什么办法吗?

然后,我将一些数据发送到PUT请求到/api/match/7。来自授权用户的请求工作正常,但未授权用户现在获得HTTP代码405-不允许使用方法(带有调试信息:Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException: The PUT method is not supported for this route. Supported methods: GET, HEAD.)。为什么?我清除了路由缓存,如您所见,在api.php中有一个已定义的路由。只有未经授权的用户才会发生这种情况。

1 个答案:

答案 0 :(得分:0)

关于第一部分:

  

授权用户可以按预期获得比赛详细信息。未经授权的用户重定向到根url /,但我希望用户保留在url上,我只想返回HTTP代码401-未经授权。我在哪里可以更改?

这是因为您的默认防护是web,因此在这种情况下,当用户尝试访问受保护的路由时,它将被重定向到主页(默认情况下,当然也可以自定义)。 / p>

要将默认防护设置更改为api,请转到config/auth.php并进行如下更改:

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

注意:在发出HTTP请求时,请添加以下标头:

/** The following tells Laravel that you want a response in json format. */
Accept: application/json
/** The following is for POST/PUT/PATCH requests, it tells the request payload format. */
Content-type: application/json

关于第二部分:

  

来自授权用户的请求工作正常,但未经授权的用户现在获得HTTP代码405-不允许的方法

PHP doesn't handle well PUT / PATCH / DELETE方法,为了绕过这种不便之处,请执行POST请求,然后添加一个隐藏的_method字段到表格。 通过_method字段发送的值将用作HTTP请求方法:

请求正文(该方法是区分大小写的):

Endpoint:
    /api/match/7

Headers:
    Accept: application/json
    Content-type: application/json

Payload or Body:
    _method: PUT
    ...