【问题标题】:Laravel socialite with passport unsupported grant typeLaravel 社交名流,护照不受支持的授权类型
【发布时间】:2018-08-27 11:47:08
【问题描述】:

在用户通过社交名流进行身份验证后,我正在尝试生成带有访问和刷新令牌的不记名令牌。

public function handleProviderCallback($provider, EmailConfirmationMailer $mailer)
{
    $user = Socialite::driver($provider)->user();
    if(User::where('email', '=', $user->getEmail())->exists()){
        $exist_user = User::where('email', '=', $user->getEmail())->first();
        Auth::loginUsingId($exist_user->id);
        $http = new GuzzleHttp\Client;
        $response = $http->post('http://localhost:8000/oauth/token', [
            'form_params' => [
                'grant_type' => 'refresh_token',
                'refresh_token' => 'the-refresh-token',
                'client_id' => 1,
                'client_secret' => 'c4ojSmOjl04QrshdSXlOmbKUOIxm6zqyhND34AT0',
                'scope' => '',
            ],
        ]);
        return json_decode((string) $response->getBody(), true);
    }else{
        //create new user here
    }
}

我从 vendor\laravel\socialite\src\Two\AbstractProvider.php 收到错误 用户函数,消息为 ""。

public function user()
{
    if ($this->hasInvalidState()) {
        throw new InvalidStateException;//here is the highlighted 
    }

    $response = $this->getAccessTokenResponse($this->getCode());

    $user = $this->mapUserToObject($this->getUserByToken(
        $token = Arr::get($response, 'access_token')
    ));

    return $user->setToken($token)
                ->setRefreshToken(Arr::get($response, 'refresh_token'))
                ->setExpiresIn(Arr::get($response, 'expires_in'));
}

这种情况的最佳做法是什么?非常感谢任何帮助。

【问题讨论】:

  • 我尝试使用 user->createToken 直接获取访问令牌,但无法从 $token 获取刷新令牌。

标签: laravel


【解决方案1】:

在没有refreshToken的情况下生成accessToken:

public function handleProviderCallback($provider)
{
    $user = Socialite::driver($provider)->user();
    if(User::where('email', '=', $user->getEmail())->exists()){
        $existUser = User::where('email', '=', $user->getEmail())->first();
        Auth::login($existUser,true);
        //remove existing tokens from user
        $tokenResult = $existUser->createToken('Personal Access Token');
        return \response()->json([
            'token_type'    =>  'Bearer',
            'expires_in'    =>  $tokenResult->token->expires_at->diffInSeconds(Carbon::now()),
            'access_token'  =>  $tokenResult->accessToken,
            'info'          =>  'Existing user'
        ]);
    }else{
        //create new user entry
    }
}

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 2017-05-14
    • 2017-05-31
    • 1970-01-01
    • 2021-07-28
    • 2017-09-18
    • 1970-01-01
    • 2018-09-26
    • 2017-12-22
    相关资源
    最近更新 更多