【问题标题】:Handling unauthorized users in Laravel在 Laravel 中处理未经授权的用户
【发布时间】:2019-09-29 20:08:24
【问题描述】:

我正在尝试使用 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");

现在,我正在向 /api/match/7 发送 GET 请求。授权用户按预期获取匹配详细信息。未经授权的用户被重定向到根 url / 但我希望用户留在该 url 上,我只想返回 HTTP 代码 401 - 未经授权。我在哪里可以改变这个?我可以在 ApiMatchController@getMatch 方法中执行此操作,但我希望中间件 auth:api 为我执行此操作。有没有办法做到这一点?

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

【问题讨论】:

标签: php laravel rest restful-authentication


【解决方案1】:

关于第一部分:

授权用户按预期获取匹配详细信息。未经授权的用户被重定向到根 url / 但我希望用户留在该 url 上,我只想返回 HTTP 代码 401 - 未经授权。我在哪里可以改变这个?

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

要将默认保护更改为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
    ...

【讨论】:

    【解决方案2】:

    我尝试了控制器下的授权方法的组合,以及 laravel 文档中提到的 Throwable: https://laravel.com/docs/8.x/errors

        try{
            $this->authorize('create',Client::class);
        } catch(Throwable $e)
        {
            echo $e->getMessage();
            return false;
        }
    

    您可以对您的 api 响应使用相同的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多