我正在使用Google PHP API。文档相当平淡...我希望允许用户连接他们的Google+信息,并使用它来在我的数据库中签署用户。为此,我需要获取他们用于Google帐户的电子邮件。我似乎无法弄清楚如何。当用户连接到我的应用程序时,通过强制许可在Facebook上很容易。任何人都有任何想法?这是我用来抓取用户google +个人资料的代码,它工作正常,除非用户可能没有列出他们的电子邮件。
include_once("$DOCUMENT_ROOT/../qwiku_src/php/google/initialize.php");
$plus = new apiPlusService($client);
if (isset($_GET['code'])) {
$client->authenticate();
$_SESSION['token'] = $client->getAccessToken();
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}
if (isset($_SESSION['token'])) {
$client->setAccessToken($_SESSION['token']);
}
if ($client->getAccessToken()) {
$me = $plus->people->get('me');
print "Your Profile: <pre>" . print_r($me, true) . "</pre>";
// The access token may have been updated lazily.
$_SESSION['token'] = $client->getAccessToken();
} else {
$authUrl = $client->createAuthUrl();
print "<a class='login' href='$authUrl'>Connect Me!</a>";
}
如果没有用户的电子邮件地址,就会失去允许用户注册Google+的目的。任何更熟悉Google API的人都知道如何获得它?
答案 0 :(得分:10)
Google API PHP客户端现在支持UserInfo API。
这是一个小样本应用程序: http://code.google.com/p/google-api-php-client/source/browse/trunk/examples/userinfo/index.php
样本的重要部分在这里:
$client = new apiClient();
$client->setApplicationName(APP_NAME);
$client->setClientId(CLIENT_ID);
$client->setClientSecret(CLIENT_SECRET);
$client->setRedirectUri(REDIRECT_URI);
$client->setDeveloperKey(DEVELOPER_KEY);
$client->setScopes(array('https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/plus.me')); // Important!
$oauth2 = new apiOauth2Service($client);
// Authenticate the user, $_GET['code'] is used internally:
$client->authenticate();
// Will get id (number), email (string) and verified_email (boolean):
$user = $oauth2->userinfo->get();
$email = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
print $email;
我假设使用包含授权代码的GET请求调用了此代码段。请记住包含或要求apiOauth2Service.php才能使其正常工作。在我的情况下是这样的:
require_once 'google-api-php-client/apiClient.php';
require_once 'google-api-php-client/contrib/apiOauth2Service.php';
祝你好运。
答案 1 :(得分:7)
使用今天的API更新:
$googlePlus = new Google_Service_Plus($client);
$userProfile = $googlePlus->people->get('me');
$emails = $userProfile->getEmails();
这假设如下:
答案 2 :(得分:2)
如果我遗漏了某些内容,请原谅我,但如果您没有他们的电子邮件地址,您如何知道要将他们与哪个Google帐户相关联?通常,您会提示用户输入其Google帐户的电子邮件,以便首先找到他们的个人资料。
使用OAuth2,您可以通过scope
参数请求权限。 (Documentation.)我想你想要的范围是https://www.googleapis.com/auth/userinfo.email
和https://www.googleapis.com/auth/userinfo.profile
。
然后,一旦获得访问令牌,get the profile info就会很简单。 (我假设您已经能够为返回的授权代码兑换访问令牌?)只需向https://www.googleapis.com/oauth2/v1/userinfo?access_token={accessToken}
发送一个get请求,该请求返回一个包含电子邮件的JSON数据库数据:
{
"id": "00000000000000",
"email": "fred.example@gmail.com",
"verified_email": true,
"name": "Fred Example",
"given_name": "Fred",
"family_name": "Example",
"picture": "https://lh5.googleusercontent.com/-2Sv-4bBMLLA/AAAAAAAAAAI/AAAAAAAAABo/bEG4kI2mG0I/photo.jpg",
"gender": "male",
"locale": "en-US"
}
在PHP库中必须有一个方法来发出请求,但我找不到它。没有保证,但试试这个:
$url = "https://www.googleapis.com/oauth2/v1/userinfo";
$request = apiClient::$io->makeRequest($client->sign(new apiHttpRequest($url, 'GET')));
if ((int)$request->getResponseHttpCode() == 200) {
$response = $request->getResponseBody();
$decodedResponse = json_decode($response, true);
//process user info
} else {
$response = $request->getResponseBody();
$decodedResponse = json_decode($response, true);
if ($decodedResponse != $response && $decodedResponse != null && $decodedResponse['error']) {
$response = $decodedResponse['error'];
}
}
}
无论如何,在您发布的代码中,只需将所需范围传递给createAuthUrl()
:
else {
$authUrl = $client->createAuthUrl("https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile");
print "<a class='login' href='$authUrl'>Connect Me!</a>";
}