我正在使用Default api-authentication
创建API我正在使用laravel 6.x
它在我根据用户注册生成并随请求传递生成的令牌时运行。
但是
我的api
路由文件如下
Route::middleware('auth:api')->post('/listUser', 'ApiController@listUser');
答案 0 :(得分:0)
您可以在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);
}
您可以通过使用自定义逻辑扩展TokenGuard
来实现此目的。或者,您可以创建一个新的中间件,该中间件断言经API认证的用户与传递的用户ID匹配。
答案 1 :(得分:0)
我的管理要点如下
对于点1
我在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
为此,我在checkValidations
中创建了一个函数ApiController
,并检查user id
是否与特定的token
相关联,如下所示:
在该功能中,我以这种方式检查
validation
token
关联的user id
,然后返回success
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 时将您重定向到登录页面。