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

时间:2013-12-07 21:52:23

标签: php oauth youtube youtube-api google-oauth

有没有办法让用户使用youtube昵称和他的REAL(*@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

USERINFO:

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

USERINFO:

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;
}

转储 (使用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

1 个答案:

答案 0 :(得分:2)

有趣的用例。 不幸的是,此时只有一个令牌无法做到这一点。原因是youtube通道由系统中的不同对象(几乎像用户帐户)表示。 OAuth授权可以属于gmail用户或youtube频道。 当我们在请求中看到youtube范围时,我们会显示用户ID列表以及用户可能拥有的任何渠道,并且审批用户会选择其中一个。结果令牌属于该对象/帐户。

我们正在构建与委托和渠道相关的新功能。例如一种可能的解决方案可能是在用户帐户上获取单个令牌,该令牌允许您访问由该帐户管理的所有通道上的API。对不起,目前没有ETA。