使用身份验证护照系统覆盖 laravel 中 apis url 的身份验证重定向

Posted

技术标签:

【中文标题】使用身份验证护照系统覆盖 laravel 中 apis url 的身份验证重定向【英文标题】:Override auth redirection of apis url in laravel with auth passport system 【发布时间】:2018-11-06 01:17:27 【问题描述】:

我创建了一些运行良好的 api。现在,当有人点击在 Web 浏览器上获取请求的受保护 api url 时,它会重定向到身份验证系统的登录。如何覆盖此功能?

详细信息

我正在使用 laravel 应用程序,在该应用程序中实施了护照和身份验证系统。到目前为止,该项目还没有任何 Web 界面。 这是我的 api.php

Route::group(['middleware' => ['auth:api'],'namespace' => 'Api', 'prefix' => '/v1'], function () 
    Route::get('/user/profile', 'UserController@profile');
    Route::get('/logout', 'Auth\LoginController@logout');
);
Route::group(['middleware' => ['api'], 'namespace' => 'Api', 'prefix' => '/v1'], function () 
    Route::post('/auth/register', 'Auth\RegisterController@create');
    Route::post('/auth/login', 'Auth\LoginController@login');
    Route::post('/auth/password/email', 'Auth\ForgotPasswordController@getResetToken');
    Route::post('/auth/password/reset', 'Auth\ResetPasswordController@reset');
);

这是我的 web.php

Route::get('/', function () 
    return view('welcome');
);

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

当我击球时

site_url/api/v1/user/profile

如果没有在邮递员中传递或使用无效的访问令牌,那么它会返回以下错误(这是可以的)。

"status":"fail","success":0,"error":401,"message":"Invalid Token!"

但是当我在网络浏览器中点击这个网址时,它会将我重定向到登录页面。

【问题讨论】:

那么你想在浏览器中显示什么? 类似 "status":"fail","success":0,"error":401,"message":"Invalid Token!" 或者只是显示未经授权。但不是网页,或者说将来我有主页,然后重定向到网站 url,但 api 不应该受到影响。 不应该,Laravel默认发送到浏览器401请求的登录路由。您只需编辑您的登录页面并编写您想要的任何内容。 因此,正如您在重定向到登录后所说的那样,我可以向他们展示我想要展示的任何内容。比如如果期望 json 则错误,否则 Not Found 或站点主页。 【参考方案1】:

我通过将这些函数添加到/app/Exceptions/Handler.php 解决了这个问题:

public function unauthenticated($request, AuthenticationException $exception)
    if($request->expectsJson())
        return response()->json('Please login',401);
    
    return redirect()->guest('admin/login');


public function unauthorized($request, AuthorizationException $exception)
    if($request->expectsJson())
        return response()->json("You don't have permission to do this",401);
    
    return redirect()->guest('login');

【讨论】:

浏览器从不默认json! 还有一件事我做了这件事,为什么当有人输入无效令牌时我会发送 401 错误。但我的问题是在浏览器中呢? 我从你的问题中了解到,你想要处理身份验证失败到自定义 url 的重定向,如果是这样,那么这些功能就可以工作,只需将 return redirect()->guest('admin/login'); 替换为你的自定义路由 我明白我需要做什么。我以前这样做过,但忘记了。无论如何,你给我的想法。 我只要把函数的定义改成这个就行了。受保护的功能未经身份验证($request,AuthenticationException $exception)返回$request->expectsJson()? response()->json(['status' => "fail","success" => 0, "error" => 401, 'message' => trans('response.invalid_token')], 401) :abort (404);

以上是关于使用身份验证护照系统覆盖 laravel 中 apis url 的身份验证重定向的主要内容,如果未能解决你的问题,请参考以下文章

护照身份验证在 laravel 5.3 中不起作用

使用外部 Laravel 护照流明 api 进行 Laravel 客户端身份验证

Laravel 5.6 护照未经身份验证

Laravel 护照刷新令牌

Laravel 通过生成的令牌进行身份验证,无需护照和 jwt

如何在 laravel 护照中实现多身份验证