当我使用laravel5.3'护照Password Grant Tokens
时this.$http.post('/oauth/token', this.form)
.then(response => {
console.log(response)
})
我收到此消息
{"error":"invalid_credentials","message":"The user credentials were incorrect."}
我想知道如何自定义此错误消息。
答案 0 :(得分:1)
根据@driesvints中的#937,Laravel Passport正在努力开发一种简化的方法来定制Passport的错误。在此之前,您可以使用以下代码。我测试了它们并使用它们。
App\Providers\AppServiceProvider.php
中添加:use Laravel\Passport\Http\Controllers\AccessTokenController;
...
public function register()
{
$this->app->bind( AccessTokenController::class, \App\myOAuth\AccessTokenController::class);
}
App\myOAuth\AccessTokenController.php
<?php
namespace App\myOAuth;
use GuzzleHttp\Exception\ClientException;
use Laravel\Passport\Http\Controllers\AccessTokenController as PassportAccessTokenController;
use League\OAuth2\Server\Exception\OAuthServerException;
use Psr\Http\Message\ServerRequestInterface;
use Zend\Diactoros\Response as Psr7Response;
class AccessTokenController extends PassportAccessTokenController
{
/**
* Authorize a client to access the user's account.
*
* @param ServerRequestInterface $request
*
* @return \Psr\Http\Message\ResponseInterface
* @throws \League\OAuth2\Server\Exception\OAuthServerException
*/
public function issueToken(ServerRequestInterface $request)
{
try {
return $this->server->respondToAccessTokenRequest($request, new Psr7Response);
} catch (ClientException $exception) {
$error = json_decode($exception->getResponse()->getBody());
throw OAuthServerException::invalidRequest('access_token', object_get($error, 'error.message'));
}
}
}
App\Exceptions\Handler.php
中添加自定义的例外public function render($request, Exception $exception)
{
...
$class = get_class($exception);
...
if ($class == 'League\OAuth2\Server\Exception\OAuthServerException' ){
return response()->json([
'code'=>$exception->getHttpStatusCode(),
'error'=>$exception->getMessage(),
'error_type'=>$exception->getErrorType()
],
$exception->getHttpStatusCode());
}
...
return parent::render($request, $exception);
}
答案 1 :(得分:0)
您可以在laravel/passport github问题找到答案。只需用不同的实现替换Laravel \ Passport \ Http \ Controllers \ AccessTokenController。
答案 2 :(得分:0)
就我而言,我想在用户不活跃或尚未完成注册时修改消息。
Passport有一个用于检查用户身份验证的功能“ validateForPassportPasswordGrant ”,因此,首先我在 User 模型中添加了验证,然后将如果用户不活跃,则该消息使用哪个护照例外。然后,继续进行常规的密码验证。
public function validateForPassportPasswordGrant($password)
{
if($this->status != 'ACTIVE') throw new
OAuthServerException('Your user is not active', '401', 'inactive_user');
return Hash::check($password, $this->password);
}
答案 3 :(得分:0)
我的解决方案使用 "flugger/laravel-responder": "^3.1"
包解决了 Laravel 版本 8。
安装后。发布包。
$ php artisan vendor:publish --provider="Flugg\Responder\ResponderServiceProvider"
app\config\responder.php
文件。...
'serializers' => [
'success' => Flugg\Responder\Serializers\SuccessSerializer::class,
'error' => \Flugg\Responder\Serializers\ErrorSerializer::class,
],
...
此配置是格式类的路径。您可以制作自己的自定义格式类。只需创建并覆盖其中的函数即可。
php artisan make:exception NotLoginException
<?php
namespace App\Exceptions;
use Flugg\Responder\Exceptions\Http\HttpException;
class NotLoginException extends HttpException
{
protected $status = 401;
/**
* The error code.
*
* @var string|null
*/
protected $errorCode = '401';
/**
* The error message.
*
* @var string|null
*/
protected $message = 'User not logged in.';
}
app\Exceptions\Handler.php
。覆盖函数 render
:// don't forget to use these class;
...
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Flugg\Responder\Exceptions\ConvertsExceptions;
use Laravel\Passport\Exceptions\OAuthServerException;
class Handler extends ExceptionHandler
...
public function render($request, Throwable $e)
{
$this->convertDefaultException($e);
if($e instanceof OAuthServerException) {
throw new PermissionDenyException();
}
if (
$e instanceof NotLoginException ) {
// you don't have always to do this. you can render your own Excption here.
return $this->renderResponse($e);
}
return parent::render($request, $e);
}
请注意,OAuthServerException
只是 passport
异常之一。我不确定 passport
是否还有其他例外。
检查异常类型。只需在渲染函数中使用 get_class($e);
。然后就可以看到异常的类类型了。所以,你可以处理它。
你可以看到结果
{
"status": 401,
"success": false,
"error": {
"code": "401",
"message": "User not logged in."
}
}