Google OAuth2 登录

  在写一个用户登录的时候遇到点小麻烦,不想写复杂但还是想验证下真实信息,所以就打算直接用第三方登录来实现了。

  看了下各大门户的接口没发现有提供用户邮箱的,包括QQ的登录居然不含QQ号,实在让人无语。因此安心用Google的登录吧,虽然大部分用户连接不上,但满足我的一部分要求就够了。

Google OAuth2 Login

  可以看到这里要求了两项信息,分别为邮箱地址和用户名称头像基本信息,主要的就这点,没有多余的步骤即可得到一个经过验证的邮箱地址。所谓节约注册时间也是指这些,不像其他网站非常不方面,第三方登录在最开始注册的时候反倒麻烦了,不过也符合一些用户信息采集的需求,可有可能是系统的限制。

  创建一个验证项目在https://console.developers.google.com/,只有繁体中文,稍微不爽,可以好好寻找下,比如创建后导出JSON会得到如下信息。


//部分信息被XXX
{
  "web": {
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "client_secret": "xxx-xxx",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "client_email": "xxx-xxx@developer.gserviceaccount.com",
    "redirect_uris": ["https://my.changda.club/Home/oauth2callback"],
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xx-xx@developer.gserviceaccount.com",
    "client_id": "xxx-xxx.apps.googleusercontent.com",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "javascript_origins": ["https://my.changda.club"]
  }
}

  这样一来就很明了了,利用client_id生成一个登录请求,然后在服务器利用client_secret获取登录信息,具体可参见https://developers.google.com/accounts/docs/OAuth2WebServer这里面的内容,一步一步还是挺简单的,唯独有个地方让人琢磨不透,就是在使用/oauth2/v3/token获取Tooken时返回的一个id_token,查询可得为一个JWT (JSON Web Token),反正包含了一部分信息需要自己解析,解析可得如下:


{"iss":"accounts.google.com",
 "at_hash":"HK6E_P6Dh8Y93mRNtsDB1Q",
 "email_verified":"true",
 "sub":"10769150350006150715113082367",
 "azp":"1234987819200.apps.googleusercontent.com",
 "email":"jsmith@example.com",
 "aud":"1234987819200.apps.googleusercontent.com",
 "iat":1353601026,
 "exp":1353604926,
 "hd":"example.com" }

  但这并非直接取得,利用PHP可用下面的方式参考,数据分为三段用点隔开,首部为加密方式,中间为基础信息,最后为加密数据,可以自行参考。


/**
 * 解析id token 数据
 * @param $data
 * @return bool
 */

protected function parseIdToken($data){
    list(, $msg) = explode(".", $data);
    if(empty($msg)){
        return false;
    }
    $data = json_decode(base64_decode($msg), true);
    if(!isset($data['sub'])){
        return false;
    }
    $this->uid = $data['sub'];
    $this->app_uid = $data['aud'];
    $this->email = $data['email'];
    $this->email_verified = $data['email_verified'];
    return true;
}

  前面的所有数据为第一次查询所得,如果用户已存在直接登录即可,如果不存在可再次查询更多详细信息,对应的接口有GET https://www.googleapis.com/plus/v1/people/userId?access_token=1/fFBGRNJru1FQd44AzqT3Zg,用于查看基础信息,此时要的东西全部获取,然后直接注册登录,跳转一步到位,很快。

  欢迎访问 : https://my.changda.club 测试。

25条评论在“Google OAuth2 登录”

写下你最简单的想法