谷歌OAuth2登录 - 获取YouTube昵称和真实电子邮件地址

3
有没有办法获取用户的YouTube昵称以及他的真实(*@gmail.com)电子邮件地址?
每当我要求Google使用“youtube.readonly”范围对用户进行身份验证时,电子邮件地址会更改为“*@pages.plusgoogle.com”。但是如果我省略YouTube范围,我将无法获得YouTube昵称...
由Google API PHP客户端(https://github.com/google/google-api-php-client)执行的请求。

示例

1. 正确的电子邮件/错误的姓名:

范围:

https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile

用户信息:

email: "********@gmail.com"         //<- I need this
family_name: <My last name>
given_name: <My first name>
name: <My full name>
verified_email: true
[...]

2.错误的电子邮件/正确的姓名:

范围:

https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
https://www.googleapis.com/auth/youtube.readonly

用户信息:

email: "<My YT nickname>-<Random(?) ID>@pages.plusgoogle.com"
family_name: "."
given_name: <My YT nickname>
name: <My YT nickname>              //<- and I need that
verified_email: true
[...]

所以:如何在不更改范围(需要重新进行身份验证)的情况下从请求#1获取电子邮件和请求#2的名称?

代码

$oauth2 = new Google_Service_Oauth2($google);
if (strlen($code) > 10) {
    try {
        $accessToken = $google->authenticate($code);
    } catch (Google_Auth_Exception $e) {
        return new false;
    }

    if (!$accessToken) {
        return false;
    }

    $userinfo = $oauth2->userinfo->get();
    var_dump($userinfo);die;
}

Dump (带有YT作用域)

object(Google_Service_Oauth2_Userinfo)[325]
  public 'email' => string '***@pages.plusgoogle.com' (length=36) //wrong email..
  public 'family_name' => string '.' (length=1)
  public 'gender' => null
  public 'given_name' => string '***' (length=10)
  public 'hd' => null
  public 'id' => string '1013***' (length=21)
  public 'link' => string 'https://plus.google.com/1013***' (length=45)
  public 'locale' => null
  public 'name' => string '***' (length=10)
  public 'picture' => string 'https://lh5.googleusercontent.com/***/photo.jpg' (length=92)
  public 'timezone' => null
  public 'verified_email' => boolean true
  protected 'data' => 
    array (size=0)
      empty
  protected 'processed' => 
    array (size=0)
      empty

你使用了什么方法?Google_Service_Oauth2 userinfo->get() 和 userinfo_v2_me->get() 都返回了我的电子邮件,适用于两个范围。 - bumpmann
两种方法都返回一个对象(Google_Service_Oauth2_Userinfo),其中包含完全相同的数据/属性。请参见我的编辑,其中包含完整的转储(已匿名化)。 - BreyndotEchse
你尝试过向谷歌提出支持请求吗? - flup
1个回答

2
有趣的用例,但是目前没有一种方法可以使用一个令牌实现。原因是YouTube频道在系统中被表示为不同的对象(几乎像用户帐户)。OAuth授权可以属于Gmail用户或YouTube频道之一。当我们在请求中看到YouTube范围时,我们会显示用户ID列表和用户可能拥有的任何频道,并且批准用户选择其中一个。生成的令牌属于该对象/帐户。
我们正在构建与委派和频道相关的新功能。例如,一个可能的解决方案是在用户帐户上获取单个令牌,以便您可以访问由该帐户管理的所有频道的API。很抱歉,目前还没有确定时间。

谢谢您的回答。关于https://support.google.com/youtube/answer/2897336,您的YouTube身份是Google+身份。也许有一种方法可以检索所有Google+页面,并让用户决定是否要使用页面身份?我无法尝试它,因为您必须注册才能使用+ Pages API。 - BreyndotEchse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接