Laravel Passport中的自定义令牌响应

时间:2017-10-12 16:49:41

标签: php api laravel-5 oauth laravel-passport

Laravel Passport的默认响应如下:

{
    "token_type": "Bearer",
    "expires_in": 31536000,
    "access_token": djabjkdakadbakdkakjdbjkba
}

我需要添加一些自定义响应,例如:

{  
   "success":"true",
   "message":"Login Successful",
   "status":"200",
   "data":{
      "token_type": "Bearer",
      "expires_in": 31536000,
      "access_token":"djabjkdakadbakdkakjdbjkba"
    }
}

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:6)

我一直在敲头几个小时,直到找到解决方案。这适用于我的Laravel 5.5.33版本:

  1. api.php 文件中添加新路线。

    Route::post('oauth/token', 'AccessTokenController@issueToken');
    
  2. 在YourProject / app / Http / Controllers / AccessTokenController.php中创建新文件

    <?php
    namespace App\Http\Controllers;
    
    use App\User;
    use Exception;
    use Illuminate\Database\Eloquent\ModelNotFoundException;
    use League\OAuth2\Server\Exception\OAuthServerException;
    use Psr\Http\Message\ServerRequestInterface;
    use Response;
    use \Laravel\Passport\Http\Controllers\AccessTokenController as 
    ATC;
    
    class AccessTokenController extends ATC
    {
        public function issueToken(ServerRequestInterface $request)
        {
            try {
                //get username (default is :email)
                $username = $request->getParsedBody()['username'];
    
                //get user
                //change to 'email' if you want
                $user = User::where('username', '=', $username)->first();
    
                //generate token
                $tokenResponse = parent::issueToken($request);
    
                //convert response to json string
                $content = $tokenResponse->getContent();
    
                //convert json to array
                $data = json_decode($content, true);
    
                if(isset($data["error"]))
                    throw new OAuthServerException('The user credentials were incorrect.', 6, 'invalid_credentials', 401);
    
                //add access token to user
                $user = collect($user);
                $user->put('access_token', $data['access_token']);
                //if you need to send out token_type, expires_in and refresh_token in the response body uncomment following lines
                // $user->put('token_type', $data['token_type']);
                // $user->put('expires_in', $data['expires_in']);
                // $user->put('refresh_token', $data['refresh_token']);
    
                return Response::json(array($user));
            }
            catch (ModelNotFoundException $e) { // email not found
                //return error message
                return response(["message" => "User not found"], 500);
            }
            catch (OAuthServerException $e) { //password not correct..token not granted
                //return error message
                return response(["message" => "The user credentials were incorrect.', 6, 'invalid_credentials"], 500);
            }
            catch (Exception $e) {
                ////return error message
                return response(["message" => "Internal server error"], 500);
            }
        }
    }
    
  3. 完成!您可以根据自己的条件自定义您想要的任何内容。这是一种不做自己的PassportServiceProvider的懒惰方法。积分转到: nauvalazhar https://gist.github.com/messi89/489473c053e3ea8d9e034b0032effb1d