【问题标题】:Laravel Socialite: Legacy People API has not been used in projectLaravel Socialite:项目中未使用旧版 People API
【发布时间】:2019-11-05 07:27:25
【问题描述】:

我使用 Laravel 5.4 和 socialite 3.0 在我的 Web 应用程序上进行社交登录。但是现在我收到一个错误Legacy People API has not been used in project xxx。然后我在一个社交名媛包的核心文件中做了一些修改。 /vendor/laravel/socialite/src/Two/GoogleProvider.php 第 61 行:替换 https://www.googleapis.com/plus/v1/people/me? https://www.googleapis.com/oauth2/v3/userinfo?

并使用以下代码更新 mapUserToObject 函数:

protected function mapUserToObject(array $user)
{
    $user['id'] = Arr::get($user, 'sub');
    $user['verified_email'] = Arr::get($user, 'email_verified');
    $user['link'] = Arr::get($user, 'profile');

    return (new User)->setRaw($user)->map([
        'id' => Arr::get($user, 'sub'),
        'nickname' => Arr::get($user, 'nickname'),
        'name' => Arr::get($user, 'name'),
        'email' => Arr::get($user, 'email'),
        'avatar' => $avatarUrl = Arr::get($user, 'picture'),
        'avatar_original' => $avatarUrl,
    ]);
}

【问题讨论】:

  • 好吗?您是否遇到任何问题或遇到任何错误?
  • 是的,我遇到过但现在解决了。
  • 嘿!从本周开始,我遇到了同样的错误(项目中没有使用旧版人员 API)...... 几个月来一切正常。你有没有找到解决这个问题的办法?现在,我必须创建一个新项目来解决这个问题:|
  • @Axel186 只需按照上述步骤操作,您现有项目中的问题也会得到解决。如果仍未修复,请在此处留言。
  • @VineetChauhan ,您能告诉我解决此问题的步骤吗?

标签: laravel google-signin laravel-socialite google-plus-signin


【解决方案1】:

此解决方案确实有效。修复了我的问题。

非常感谢。

如果有人遇到此问题,这是整个文件。只需更改位于以下位置的 GoogleProvider 类: ./vendor/laravel/socialite/src/Two/GoogleProvider.php 与此:

class GoogleProvider extends AbstractProvider implements ProviderInterface{

protected $scopeSeparator = ' ';

/**
 * The scopes being requested.
 *
 * @var array
 */
protected $scopes = [
    'openid',
    'profile',
    'email',
];

/**
 * {@inheritdoc}
 */
protected function getAuthUrl($state)
{
    return $this->buildAuthUrlFromBase('https://accounts.google.com/o/oauth2/auth', $state);
}

/**
 * {@inheritdoc}
 */
protected function getTokenUrl()
{
    return 'https://accounts.google.com/o/oauth2/token';
}

/**
 * Get the POST fields for the token request.
 *
 * @param  string  $code
 * @return array
 */
protected function getTokenFields($code)
{
    return array_add(
        parent::getTokenFields($code), 'grant_type', 'authorization_code'
    );
}

/**
 * {@inheritdoc}
 */
protected function getUserByToken($token)
{
    //fixing legacy google+ api
    $response = $this->getHttpClient()->get('https://www.googleapis.com/oauth2/v3/userinfo?', [
        'query' => [
            'prettyPrint' => 'false',
        ],
        'headers' => [
            'Accept' => 'application/json',
            'Authorization' => 'Bearer '.$token,
        ],
    ]);
    return json_decode($response->getBody(), true);
}

/**
 * {@inheritdoc}
 */
protected function mapUserToObject(array $user)
{
    //fixing legacy google+ api
    $user['id'] = Arr::get($user, 'sub');
    $user['verified_email'] = Arr::get($user, 'email_verified');
    $user['link'] = Arr::get($user, 'profile');

    $avatarUrl = Arr::get($user, 'image.url');
    return (new User)->setRaw($user)->map([
        'id' => Arr::get($user, 'sub'),
        'nickname' => Arr::get($user, 'nickname'),
        'name' => Arr::get($user, 'name'),
        'email' => Arr::get($user, 'email'),
        'avatar' => $avatarUrl = Arr::get($user, 'picture'),
        'avatar_original' => $avatarUrl,
    ]);

}

}

【讨论】:

  • 谢谢兄弟,它对我有用..googleapis.com/plus/v1/people/me?带有googleapis.com/oauth2/v3/userinfo的网址?
  • 更新社交名流包到3.3.0
  • 一直在尝试解决这个问题并遇到了这个问题,现在一切都很好。在生产方面没有问题,但如果您的应用在 6 个月内到达旧端点,谷歌似乎只允许旧 api 端点。由于我在开发我的网站时休息了一下,回来后我遇到了遗留问题!
  • @Brian 如果您已经使用了折旧的 API,Google 将允许 API 调用,但如果您的应用过去没有调用过 API,他们会希望您使用新调用
【解决方案2】:

替换

https://www.googleapis.com/plus/v1/people/me? 网址与 https://www.googleapis.com/oauth2/v3/userinfo?

Google 已更新 API 端点并建议使用此 https://www.googleapis.com/oauth2/v3/userinfo? 端点来获取用户详细信息。

https://developers.google.com/people/legacy

【讨论】:

  • 更新社交名流包到3.3.0
  • @EmptyBrain 这是一个生产服务器。我不想改变任何东西以避免任何并发症。目前,这对我来说很好。
【解决方案3】:

我也有 Laravel 5.4,在我的情况下,我帮助将 laravel/socialite 从 3.0.* 升级到 3.4。

我在作曲家中设置了这个设置:"laravel/socialite": "~3.0" 并运行composer update。 不要忘记清除缓存:php artisan cache:clear

【讨论】:

    【解决方案4】:

    这里的诀窍是它说legacy people api,这通常意味着您正在尝试使用旧的Google+ 范围之一。

    Google+ 关闭后,曾经有一部分 google+ api 被移至People api 的与配置文件相关的许多端点。

    正如您所调用的端点所见,您正在尝试使用多年前关闭的旧 google+ 端点。

    googleapis.com/plus/v1

    你应该使用people.get

    正确的端点应该是。

    GET https://people.googleapis.com/v1/{resourceName=people/*}
    

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2020-04-24
      • 2020-04-21
      • 2020-06-26
      • 2021-04-12
      • 2020-03-08
      • 2020-02-27
      • 2016-06-28
      • 2017-04-18
      相关资源
      最近更新 更多