9

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

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

4

4 回答 4

5

根据#937中的@ 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);
    }
于 2019-04-19T13:53:35.113 回答
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);
}
于 2020-08-28T19:30:36.640 回答
0

我的解决方案通过包解决了 Laravel 版本 8 "flugger/laravel-responder": "^3.1"

  1. 安装flugger/laravel-responder包

  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."
    }
}
于 2021-05-06T01:56:06.777 回答
0

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

于 2017-07-28T11:18:39.460 回答