有没有办法改变laravel api_token auth:api的响应

时间:2019-09-26 11:26:25

标签: php laravel laravel-6

我正在使用Default api-authentication

创建API

我正在使用laravel 6.x

它在我根据用户注册生成并随请求传递生成的令牌时运行。

但是

  1. 当我传递错误的令牌时,它会显示登录页面HTML,我想显示一些自定义的 JSON 响应而不是 HTML
  2. 还可以通过任何方法检查传递的令牌与传递的用户ID是否相同。因为用户可以使用令牌传递不同的用户ID。

我的api路由文件如下

Route::middleware('auth:api')->post('/listUser', 'ApiController@listUser');

4 个答案:

答案 0 :(得分:0)

  1. 您可以在Authenticate中间件中配置自定义响应。例如

    public function handle($request, Closure $next, $guard = null)
        {
            if (Auth::guard($guard)->guest()) {
                if ($guard === 'api') {
                    return response('Unauthorized.', 401);
                } else {
                    return redirect()->guest('login');
                }
            }
            return $next($request);
        }
    
  2. 您可以通过使用自定义逻辑扩展TokenGuard来实现此目的。或者,您可以创建一个新的中间件,该中间件断言经API认证的用户与传递的用户ID匹配。

答案 1 :(得分:0)

我的管理要点如下

对于点1

  1. 当我传递错误的令牌时,它会显示登录页面HTML,我想显示一些自定义的 JSON 响应而不是 HTML

我在App/Exceptions/handler.php

中进行了更改

如下修改render function

public function render($request, Exception $exception)
{
    if ($exception instanceof NotFoundHttpException) {
        if ($request->is('api/*')) {
            return response()->json(['error' => 'Not Found'], 404);
        }
        //return response()->view('404', [], 404);
    }
    return parent::render($request, $exception);
}

效果很好,因为我有一条基于api的路线

我的api路由看起来很像

// Request with Authentication v1

Route::group(['prefix' => 'v1', 'namespace' => 'Api\v1', 'middleware' => ['api','auth:api'] ], function () {

  Route::post('/myProfile', 'ApiController@myProfile');

});

// Request without Authentication v1
Route::group(['prefix' => 'v1', 'namespace' => 'Api\v1', 'middleware' => 'api'], function () {
  Route::post('/register', 'ApiController@register');

});

对于Point 2

  1. 还可以通过任何方法检查传递的令牌与传递的用户ID是否相同。因为用户可以使用令牌传递不同的用户ID。

为此,我在checkValidations中创建了一个函数ApiController,并检查user id是否与特定的token相关联,如下所示:

在该功能中,我以这种方式检查

  1. 检查所有从调用方法传递的validation
  2. 匹配与token关联的user id,然后返回success
  3. 其他return令牌响应无效

功能代码

public function checkValidations($required = [], $request = [])
{
    $validator = Validator::make($request->all(), $required);
    if ($validator->fails()) {
         $this->response[] = array(
                'status' => 'false',
                'response_msg' => implode(",",$validator->messages()->all()),
            );
         return array('response' => $this->response);
    } else if(isset($request['api_token']) && auth('api')->user()->id == 
         $request['id']) {
        return 'success';
    } else {
        $this->response[] = array(
                'status' => 'false',
                'response_msg' => 'Invalid token',
            );
         return array('response' => $this->response);
    }
}

然后从任何函数中调用该checkValidations,并可以将其重用

public function myProfile(Request $request)
{
    $validation = [
           'id' => 'bail|required|exists:users',
           'api_token' => 'bail|required|min:60|max:60'
     ];
    if( $this->checkValidations($validation, $request) == 'success'){
            $this->response[] = array(
                    'status' => 'true',
                    'response_msg' => 'Success',
                            'data' => auth('api')->user()
                );
    }

    return array('response' => $this->response);

}

也许还有很多其他最好的方法来管理这些问题,但是我没有找到,所以我以上述方式进行管理。

答案 2 :(得分:0)

我刚刚验证了与身份验证相关的异常类型,然后验证了 URL(作为 API 守卫使用 '/api' 只需验证它)并触发响应。

if($exception instanceof \Illuminate\Auth\AuthenticationException){
            if($request->is('api/*')){
                return response()->json([
                    'success' => false,
                    'message' => 'User not logged'
                ]);
            }
        }

答案 3 :(得分:0)

我在 app/Exceptions/Handler.php 中进行了以下更改。

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Not Authorized'], 404);
    }

    return redirect()->guest(route('login'));
}

在文档中添加 use Illuminate\Auth\AuthenticationException。另外,不要忘记将 X-Requested-With:XMLHttpRequest 添加到您的请求标头中。 (或邮递员中的标题)

return redirect()->guest(route('login')); 是在您不使用 API 时将您重定向到登录页面。