Laravel Passport中的自定义令牌响应

San*_*ota 3 php api oauth laravel-5 laravel-passport

Laravel Passport的默认响应如下所示:

{
    "token_type": "Bearer",
    "expires_in": 31536000,
    "access_token": djabjkdakadbakdkakjdbjkba
}
Run Code Online (Sandbox Code Playgroud)

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

{  
   "success":"true",
   "message":"Login Successful",
   "status":"200",
   "data":{
      "token_type": "Bearer",
      "expires_in": 31536000,
      "access_token":"djabjkdakadbakdkakjdbjkba"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

vah*_*ian 7

在寻找解决方案之前,我一直在努力奋斗数小时。这目前适用于我的Laravel 5.5.33版本:

  1. 在您的api.php文件中添加一条新路由。

    Route::post('oauth/token', 'AccessTokenController@issueToken');
    
    Run Code Online (Sandbox Code Playgroud)
  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);
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 做完了!您可以根据自己的条件在这里自定义任何内容。这是不创建自己的PassportServiceProvider的惰性方法。积分转至:nauvalazhar https://gist.github.com/messi89/489473c053e3ea8d9e034b0032effb1d