【问题标题】:Get user information from Google OAuth PHP API从 Google OAuth PHP API 获取用户信息
【发布时间】:2014-04-12 17:54:19
【问题描述】:

我想获取用户信息,例如姓名、姓氏、电子邮件地址、图像等。

通过谷歌账号登录网站后,我使用了以下PHP代码:

<?php

########## Google Settings.. Client ID, Client Secret #############
// I fill these fieds with my keys
$google_client_id       = '............';
$google_client_secret   = '...............';
$google_redirect_url    = '.......................';
$google_developer_key   = '............';

########## MySql details (Replace with yours) #############
// I filled these fields with my data
$db_username = "*******"; //Database Username
$db_password = "*******"; //Database Password
$hostname = "*******"; //Mysql Hostname
$db_name = '**********'; //Database Name
###################################################################

//include google api files
require_once 'src/Google_Client.php';
require_once 'src/contrib/Google_Oauth2Service.php';

//start session
session_start();

$gClient = new Google_Client();
$gClient->setApplicationName('Login to techsa.ir');
$gClient->setClientId($google_client_id);
$gClient->setClientSecret($google_client_secret);
$gClient->setRedirectUri($google_redirect_url);
$gClient->setDeveloperKey($google_developer_key);

$google_oauthV2 = new Google_Oauth2Service($gClient);

//If user wish to log out, we just unset Session variable
if (isset($_REQUEST['reset'])) 
{
  unset($_SESSION['token']);
  $gClient->revokeToken();
  header('Location: ' . filter_var($google_redirect_url, FILTER_SANITIZE_URL));
}


if (isset($_GET['code'])) 
{ 
    $gClient->authenticate($_GET['code']);
    $_SESSION['token'] = $gClient->getAccessToken();
    header('Location: ' . filter_var($google_redirect_url, FILTER_SANITIZE_URL));
    return;
}


if (isset($_SESSION['token'])) 
{ 
        $gClient->setAccessToken($_SESSION['token']);
}


if ($gClient->getAccessToken()) 
{
      //Get user details if user is logged in
      $user                 = $google_oauthV2->userinfo->get();
      $user_id              = $user['id'];
      $user_name            = filter_var($user['name'], FILTER_SANITIZE_SPECIAL_CHARS);
      $email                = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
      $profile_url          = filter_var($user['link'], FILTER_VALIDATE_URL);
      $profile_image_url    = filter_var($user['picture'], FILTER_VALIDATE_URL);
      $personMarkup         = "$email<div><img src='$profile_image_url?sz=50'></div>";
      $_SESSION['token']    = $gClient->getAccessToken();
}
else 
{
    //get google login url
    $authUrl = $gClient->createAuthUrl();
}

//HTML page start
echo '<html xmlns="http://www.w3.org/1999/xhtml">';
echo '<head>';
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
echo '<title>Login with Google</title>';
echo '</head>';
echo '<body>';
echo '<h1>Login with Google</h1>';

if(isset($authUrl)) //user is not logged in, show login button
{
    echo '<a class="login" href="'.$authUrl.'"><img src="images/google-login-button.png" /></a>';
} 
else // user logged in 
{
   /* connect to mysql */
    $connecDB = mysql_connect($hostname, $db_username, $db_password)or die("Unable to connect to MySQL");
    mysql_select_db($db_name,$connecDB);

    //compare user id in our database
    $result = mysql_query("SELECT COUNT(g_id) FROM social_users WHERE g_id=$user_id");
    if($result === false) { 
        die(mysql_error()); //result is false show db error and exit.
    }

    $UserCount = mysql_fetch_array($result);

    if($UserCount[0]) //user id exist in database
    {
        echo 'Welcome back '.$user_name.'!';
    }else{ //user is new
        echo 'Hello! '.$user_name.', Thanks for Registering!';
        @mysql_query("INSERT INTO social_users (g_id, g_name, g_email, g_link, g_image, created_date) VALUES ($user_id, '$user_name','$email','$profile_url','$profile_image_url', now())");
    }


    echo '<br /><a href="'.$profile_url.'" target="_blank"><img src="'.$profile_image_url.'?sz=50" /></a>';
    echo '<br /><a class="logout" href="?reset=1">Logout</a>';

    //list all user details
    echo '<pre>'; 
    print_r($user);
    echo '</pre>';  
}

echo '</body></html>';
?>

我的数据库中有一个名为social_users 的表。用户授予权限,但表为空。

【问题讨论】:

    标签: php google-plus google-oauth


    【解决方案1】:

    您的情况不需要$google_developer_key

    以下是当今如何使用google-api-php-client 库获取用户信息:

    <?php
    
    require_once('google-api-php-client-1.1.7/src/Google/autoload.php');
    
    const TITLE = 'My amazing app';
    const REDIRECT = 'https://example.com/myapp/';
    
    session_start();
    
    $client = new Google_Client();
    $client->setApplicationName(TITLE);
    $client->setClientId('REPLACE_ME.apps.googleusercontent.com');
    $client->setClientSecret('REPLACE_ME');
    $client->setRedirectUri(REDIRECT);
    $client->setScopes(array(Google_Service_Plus::PLUS_ME));
    $plus = new Google_Service_Plus($client);
    
    if (isset($_REQUEST['logout'])) {
            unset($_SESSION['access_token']);
    }
    
    if (isset($_GET['code'])) {
            if (strval($_SESSION['state']) !== strval($_GET['state'])) {
                    error_log('The session state did not match.');
                    exit(1);
            }
    
            $client->authenticate($_GET['code']);
            $_SESSION['access_token'] = $client->getAccessToken();
            header('Location: ' . REDIRECT);
    }
    
    if (isset($_SESSION['access_token'])) {
            $client->setAccessToken($_SESSION['access_token']);
    }
    
    if ($client->getAccessToken() && !$client->isAccessTokenExpired()) {
            try {
                    $me = $plus->people->get('me');
                    $body = '<PRE>' . print_r($me, TRUE) . '</PRE>';
            } catch (Google_Exception $e) {
                    error_log($e);
                    $body = htmlspecialchars($e->getMessage());
            }
            # the access token may have been updated lazily
            $_SESSION['access_token'] = $client->getAccessToken();
    } else {
            $state = mt_rand();
            $client->setState($state);
            $_SESSION['state'] = $state;
            $body = sprintf('<P><A HREF="%s">Login</A></P>',
                $client->createAuthUrl());
    }
    
    ?>
    
    <!DOCTYPE HTML>
    <HTML>
    <HEAD>
            <TITLE><?= TITLE ?></TITLE>
    </HEAD>
    <BODY>
            <?= $body ?>
            <P><A HREF="<?= REDIRECT ?>?logout">Logout</A></P>
    </BODY>
    </HTML>
    

    别忘了-

    1. Google API console 获取 Web 客户端 ID 和密码
    2. 在同一地点授权https://example.com/myapp/

    您可以在Youtube GitHub 找到更多示例。

    【讨论】:

      【解决方案2】:

      试试这个:

      if ($result = $mysqli->query("SELECT COUNT(g_id) as usercount FROM social_users WHERE g_id=$user_id")) { $usercount = $result->fetch_object()->usercount; $结果->关闭(); if ($usercount > 0) { //有这样的用户 } }

      【讨论】:

      • 请提供更多解释说明为什么这样做会更好
      • 只发布代码作为答案并不是一个好习惯。请向提问者解释这段代码将如何帮助他们,以及代码如何解决问题。
      猜你喜欢
      • 2012-12-10
      • 1970-01-01
      • 2013-01-27
      • 2020-02-04
      • 1970-01-01
      • 2012-07-21
      • 2011-08-08
      • 2018-07-15
      • 1970-01-01
      相关资源
      最近更新 更多