如何使用knpuniversity/oauth2-client-bundle获取Google刷新令牌?

dluptydi  于 2024-01-06  发布在  Go
关注(0)|答案(2)|浏览(197)

我使用knpuniversity/oauth2-client-bundleleague/oauth2-google在我的Symfony 4 Web应用程序中使用“使用Google登录”功能连接用户。我遵循了this tuto。我在Google注册了我的应用程序。
我在knpu.oauth2.client.google配置(config/packages/knpu_oauth2_client.yaml文件)中设置了access_type: offline
我尝试在我的GoogleAuthenticator::getUser(League\OAuth2\Client\Token\AccessToken $credentials)方法(它扩展了KnpU\OAuth2ClientBundle\Security\Authenticator\SocialAuthenticator)中获取用户刷新令牌。
不幸的是,$credentials->getRefreshToken()总是返回null
为什么我没有获得用户刷新令牌?

l3zydbqr

l3zydbqr1#

根据文档,“刷新令牌仅提供给请求离线访问的应用程序”。因此,当示例化提供程序时,您需要设置accessType。

use League\OAuth2\Client\Provider\Google;

$provider = new Google([
    'clientId'     => '{google-client-id}',
    'clientSecret' => '{google-client-secret}',
    'redirectUri'  => 'https://example.com/callback-url',
    'accessType'   => 'offline',
]);

字符串
在knpu_oauth2_client配置中,您可以执行以下操作:

google:
    type: google
    client_id: '%env(OAUTH_GOOGLE_CLIENT_ID)%'
    client_secret: '%env(OAUTH_GOOGLE_CLIENT_SECRET)%'
    redirect_params: {}
    access_type: offline

jexiocij

jexiocij2#

我也遇到了同样的问题。必须做两件事来解决这个问题:
1.)add prompt => consent强制新的同意,否则离线访问类型不会改变,如果在开始时没有配置

return $clientRegistry
  ->getClient('google') // key used in config/packages/knpu_oauth2_client.yaml
  ->redirect([
    'https://www.googleapis.com/auth/webmasters.readonly'
  ], 
      [
         'prompt' => 'consent',
        'access_type' => 'offline',
      ]
    );

字符串
2.)这是行不通的:

$accessToken = $client->getAccessToken()->getToken();
$refreshToken = $client->getAccessToken()->getRefreshToken();


相反,这:

$tokens = $client->getAccessToken();
$accessToken = $tokens->getToken();
$refreshToken = $tokens->getRefreshToken();

相关问题