简体   繁体   中英

Unauthorized 401 on Google+ API moments.insert with PHP

I want to create a small bot, which can push G+ moments to G+ page under certain conditions. Want to try it with PHP. So I have: registered web app in Google Console, Google+ API turned on, small PHP-script on my Apache server and 401 Unathorized in result. I'm using google-api-php-client from https://github.com/google/google-api-php-client

I've searched answer through the Internet, but nothing've found. Everywhere everyone have had their own happy end and all worked, but I've try all of it - and only 401 came to me.

My script:

<?
header("Content-Type: text/html; charset=utf-8");
session_start();
ini_set("display_errors", 1);
require_once 'Google/Client.php';
require_once 'Google/Service/Plus.php';
$client = new Google_Client();
$client->setClientId("MY_CLIENT_ID");
$client->setClientSecret("MY_CLIENT_SECRET");
$client->setRedirectUri("REDIRECT_URL");
$client->setAccessType('offline');
$client->addScope("https://www.googleapis.com/auth/plus.login");
$client->addScope("https://www.googleapis.com/auth/plus.me");
$client->addScope("https://www.googleapis.com/auth/userinfo.profile");
$client->addScope("https://www.googleapis.com/auth/userinfo.email");
$requestVisibleActions = array('http://schemas.google.com/AddActivity');
$client->setRequestVisibleActions($requestVisibleActions);
if (!isset($_GET['code'])) {
    if (isset($_SESSION['access_token'])) {
        $client->setAccessToken($_SESSION['access_token']);
        $moment_body = new Google_Service_Plus_Moment();
        $plus = new Google_Service_Plus($client);
        $moment_body->setType("http://schemas.google.com/AddActivity");
        $item_scope = new Google_Service_Plus_ItemScope();
        $item_scope->setId("target-id-214wdefsadf1");
        $item_scope->setType("http://schemas.google.com/AddActivity");
        $item_scope->setName("The Google+ Platform");
        $item_scope->setDescription("A page that describes just how awesome Google+ is!");
        $item_scope->setImage("https://developers.google.com/+/plugins/snippet/examples/thing.png");
        $moment_body->setTarget($item_scope);
        $momentResult = $plus->moments->insert('me', 'vault', $moment_body);
    } else {
        $authUrl = $client->createAuthUrl();
        header("Location: ".$authUrl);
        exit;
    }
} else {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    header("Location: REDIRECT_URL");
    exit;
}

So script succefully requests all needed access accordingly to scopes registered in client, gets a token, writes it into session, but when it try to insert new moment it gets Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling POST https://www.googleapis.com/plus/v1/people/me/moments/vault : (401) Unauthorized' in /var/www/rico/Google/Http/REST.php:79

What is wrong? And I've try some solutions placed here, on stackoveflow, but they didn't help. I also checked my authURL - it seems OK, with correct request_visible_actions and other... I don't know what is wrong...

You may be missing a few things. Maybe your example assumes you are putting the real values for some of these you have set. However you will want ApplicationName and DeveloperKey set. Many api calls will return not authorized if you don't have the developer key set for sure.

$client->setApplicationName($plApp->authenticationData->applicationName);
$client->setDeveloperKey($authData->apiKey);

I presume you are actually setting these below. Return url must match that which was set for the application on the google developer site for the specific application

$client->setClientId($authData->clientId);
$client->setClientSecret($authData->clientSecret);
$client->setRedirectUri($returnUrl);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM