【问题标题】:How to custom laravel passport error message?如何自定义 laravel 护照错误消息?
【发布时间】:2023-03-22 21:46:01
【问题描述】:

当我使用 laravel5.3 的 Passport Password Grant Tokens

this.$http.post('/oauth/token', this.form)
     .then(response => {
         console.log(response)
     })

我收到这条消息

{"error":"invalid_credentials","message":"The user credentials were incorrect."}

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

【问题讨论】:

  • 这是vendor\league\oauth2-server\src\Exception\OAuthServerException.phpline:120发送的消息

标签: laravel message laravel-passport


【解决方案1】:

根据@driesvints 中的@driesvints,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);
    }

【讨论】:

    【解决方案2】:

    您可以在laravel/passport github问题上找到答案。只需用不同的实现替换 Laravel\Passport\Http\Controllers\AccessTokenController。

    【讨论】:

      【解决方案3】:

      就我而言,我想在用户处于非活动状态或尚未完成注册时修改消息。

      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);
      }
      

      【讨论】:

        【解决方案4】:

        我的解决方案使用 "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."
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-28
          • 1970-01-01
          • 2020-12-05
          • 2018-06-09
          • 2018-08-12
          • 2017-12-28
          • 1970-01-01
          • 2015-12-22
          • 2017-03-29
          相关资源
          最近更新 更多