如何通过Google OAuth创建登录系统

时间:2017-11-13 14:10:54

标签: php oauth-2.0 google-api google-oauth2

我是Google API的新手,我正在尝试创建一个登录系统,通过Oauth Google API获取电子邮件ID和youtube频道数据。在我的代码下面完美地用于获取数据,但是当我刷新页面时我也无法创建登录系统我丢失了整个数据并且它再次要求登录。请指导我如何实现登录系统,也请检查我的代码是否正确或可以缩短

$client_id = "xxxxxxxxxxxxxxxxxxx";
$client_secret = "xxxxxxxxxxxxxxx";
$redirect_uri = "http://localhost/mysite/oauth2callback";
$code = $_GET["code"];

$oauth2token_url = "https://accounts.google.com/o/oauth2/token";
$clienttoken_post = array(
        "code" => $code,
        "client_id" => $client_id,
        "client_secret" => $client_secret,
        "redirect_uri" => $redirect_uri,
        "grant_type" => "authorization_code"
);

$curl = curl_init($oauth2token_url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $clienttoken_post);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  

$json_response = curl_exec($curl); 
curl_close($curl);
$authObj = json_decode($json_response);
$access_token = $authObj->access_token;
$token_type = $authObj->token_type;
$expires_in = $authObj->expires_in;
$refresh_token = $authObj->refresh_token;
$Id_token = $authObj->id_token;

session_start();
$_SESSION['access_token'] = $access_token;  

//getting the email id
$email_url = 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token='.$_SESSION['access_token'];
$em = curl_init();
curl_setopt( $em, CURLOPT_URL, $email_url );
curl_setopt($em, CURLOPT_HEADER, 0);    
curl_setopt( $em, CURLOPT_RETURNTRANSFER, 1 );
$eamilOBJ = json_decode( curl_exec( $em ) );
$email = $eamilOBJ->email;


if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {        
    $url = 'https://www.googleapis.com/youtube/v3/channels?fields=items(id,snippet(title,description,customUrl,thumbnails(default)),statistics(viewCount,subscriberCount))&part=snippet%2Cstatistics&mine=true&access_token='.$_SESSION['access_token'];

    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt($ch, CURLOPT_HEADER, 0);    
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    $channelOBJ = json_decode( curl_exec( $ch ) );

    $channel_id = $channelOBJ->items[0]->id;
    $thumbnail_url = $channelOBJ->items[0]->snippet->thumbnails->default->url;
    $youtubetitle = $channelOBJ->items[0]->snippet->title;
    $description = $channelOBJ->items[0]->snippet->description;
    $total_subscriber = $channelOBJ->items[0]->statistics->subscriberCount;

    echo 'Email ID : '.$email;
    echo 'Image: URL: '.$thumbnail_url;
    echo 'Channel Title: '.$youtubetitle;
    echo 'Total Subscriber: '.$total_subscriber;    
}
else{
    echo '<a href="https://accounts.google.com/o/oauth2/auth?
        redirect_uri=http://localhost/mysite/oauth2callback&
        response_type=code&
        client_id=xxxxxxxxxxxxxxx&
        scope=https://www.googleapis.com/auth/youtube.readonly+https://www.googleapis.com/auth/userinfo.email&
        approval_prompt=force&
        access_type=offline">
        <button class="loginBtn loginBtn--google">Sign in with Google</button></a>';
   }

1 个答案:

答案 0 :(得分:0)

您从上述请求获得的access_token是您将用于向服务发出请求的内容。一小时后,您的访问令牌将过期,您需要请求新的access_token,您将上面的refresh_token和 HTTP Post 更新为:注意: grant_type = refresh_token

https://accounts.google.com/o/oauth2/token
client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token

这是回复:

{
"access_token" : "ya29.1.AADtN_XK16As2ZHlScqOxGtntIlevNcasMSPwGiE3pe5ANZfrmJTcsI3ZtAjv4sDrPDRnQ",
"token_type" : "Bearer",
"expires_in" : 3600
}