如何自定义laravel passport错误信息?

时间:2016-12-14 07:53:01

标签: laravel message laravel-passport

当我使用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."}

我想知道如何自定义此错误消息。

4 个答案:

答案 0 :(得分:1)

根据@driesvints中的#937,Laravel Passport正在努力开发一种简化的方法来定制Passport的错误。在此之前,您可以使用以下代码。我测试了它们并使用它们。

  1. 在页面App\Providers\AppServiceProvider.php中添加:
use Laravel\Passport\Http\Controllers\AccessTokenController;

...
public function register()
    {
        $this->app->bind( AccessTokenController::class, \App\myOAuth\AccessTokenController::class);
    }
  1. 创建此页面: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'));
        }
    }
}
  1. 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。

  1. 安装 flugger/laravel-responder package

  2. 安装后。发布包。

$ php artisan vendor:publish --provider="Flugg\Responder\ResponderServiceProvider"
  1. 您可以检查 app\config\responder.php 文件。
...
    'serializers' => [
        'success' => Flugg\Responder\Serializers\SuccessSerializer::class,
        'error' => \Flugg\Responder\Serializers\ErrorSerializer::class,
    ],
...

此配置是格式类的路径。您可以制作自己的自定义格式类。只需创建并覆盖其中的函数即可。

  1. 创建您自己的异常处理程序。
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.';

}

  1. 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);
    }
    
  1. 请注意,OAuthServerException 只是 passport 异常之一。我不确定 passport 是否还有其他例外。 检查异常类型。只需在渲染函数中使用 get_class($e);。然后就可以看到异常的类类型了。所以,你可以处理它。

  2. 你可以看到结果

{
    "status": 401,
    "success": false,
    "error": {
        "code": "401",
        "message": "User not logged in."
    }
}