Google Client API - 缺少require参数:redirect_uri

Jos*_*ins 10 php google-calendar-api google-api

所以我按照快速入门指南决定将其分解为一个名为scheduler的类.我正在处理身份验证代码,但我一直得到这个:"错误400(OAuth 2错误)错误无效请求缺少所需参数:redirect_uri".

class scheduler{

//The Google Client object
private $googleClient;

//the Google Calendar Service ojbect
private $calendarService;

/*
*   Google Calendar Setup
*
*   This creates a Google Client object so that you may create a Google Calendar object.
*
*/
function __construct(){
    //set the application name
    define("APPLICATION_NAME", "Web client 1");
    //
    define("CREDENTIALS_PATH", "~/scheduler/credentials.json");
    //
    define("CLIENT_SECRET_PATH", __DIR__ . "/scheduler/client_secret.json");
    //
    define("SCOPES", implode(" ", array(Google_Service_Calendar::CALENDAR_READONLY)));

    /*if(php_sapi_name() != "cli"){
        throw new Exception("This application must be run on the command line");    
    }*/

    //create the google client
    $this->googleClient = new Google_Client();

    //setup the client
    $this->googleClient->setApplicationName(APPLICATION_NAME);
    $this->googleClient->setDeveloperKey("AIzaSyBmJLvNdMYuFhVpWalkUdyStrEBoVEayYM");
    $this->googleClient->setScopes(SCOPES);
    $this->googleClient->setAuthConfigFile(CLIENT_SECRET_PATH);
    $this->googleClient->setAccessType("offline");

    //get the credentials file path
    $credentialsPath = expandHomeDirectory(CREDENTIALS_PATH);

    //if the file exists
    if(file_exists($credentialsPath)){

        //get the credentials from the file
        $accessToken = file_get_contents($credentialsPath); 

    }//if it does not
    else{

        //request the authorization url
        $authURL = $this->googleClient->createAuthUrl();
        //print the authorization ulr
        echo "<a href=\"$authURL\">Press Me</a><br /><br />";

        //prompt the user to enter the auth code
        print("Enter authentication code: ");

        //
        $authCode = trim(fgets(STDIN));

        //exchange authorization for an access token
        $accessToken = $this->googleClient->authenticate($authCode);

        //store credentials to disk
        if(!file_exists(dirname($credentialsPath))){
            mkdir(dirname($credentialsPath), 0700, true);   
        }

        //put the contents into the credential files
        file_put_contents($credentialsPath, $accessToken);
    }

    $this->googleClient->setAccessToken($accessToken);

    //refresh token if its expired
    if($this->googleClient->isAccessTokenExpired()){
        $this->googleClient->refreshToken($client->getRefreshToken());

        file_put_contents($credentialsPath, $this->googleClient->getAccessToken()); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现了问题的原因,没有解决方案.在我的Google Developer Console下,我尝试将" http:// localhost / "放入"授权重定向URI"部分.它给了我这个错误"抱歉,有问题.如果您输入了信息,请检查并重试.否则,问题可能会自行解决,请稍后再回来查看." 有没有办法让Google Developer Console接受本地主机服务器的重定向uri?

Jam*_*s07 11

只需setRedirectUri($absoluteUrl)在客户端对象上使用方法:

$client = new Google_Client();
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
Run Code Online (Sandbox Code Playgroud)

通过:

https://developers.google.com/api-client-library/php/auth/web-app


Kev*_*ary 7

Google 的 Sheet API 的“PHP 快速入门”文档在https://developers.google.com/sheets/api/quickstart/php 上似乎已过时。

为了让他们的演示与 PHP 7.2+ 一起工作,我不得不进行了相当多的修改,而且还不是很清楚发生了什么。下面是他们的快速入门的评论更新版本,可能对在使用 Google Sheets API 和 PHP 时遇到问题的其他人有所帮助。

<?php
/**
 * Updated Google Sheets Quickstart
 *
 * https://developers.google.com/sheets/api/quickstart/php
 */
require __DIR__ . '/vendor/autoload.php';

/**
* Appends one slash at the end, and removes any extra slashes
* /sf/answers/653776861/
*
* @return string $path with the slash appended
*/
function addTrailingSlash ($path)
{
    return rtrim ($path, '/') . '/';
}

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient() {

     // Change this to a secure location where you'll save your config *.json files
     // Make sure it isn't publicly available on the web
    $configPath = addTrailingSlash (getcwd());

    // This get's generated by the script, so don't create it
    $credentialsPath = $configPath . 'credentials.json';

    $client = new Google_Client();

    // Matches the "Application Name" you enter during the "Step 1" wizard
    $client->setApplicationName( 'API App Name' );
    $client->setScopes( Google_Service_Sheets::SPREADSHEETS_READONLY );

    // You need to go through "Step 1" steps to generate this file: https://developers.google.com/sheets/api/quickstart/php
    $client->setAuthConfig( $configPath . 'client_secret.json' );
    $client->setAccessType( 'offline' );

    // This must match the "callback URL" that you enter under "OAuth 2.0 client ID" in the Google APIs console at https://console.developers.google.com/apis/credentials
    $client->setRedirectUri( 'https://' . $_SERVER['HTTP_HOST'] . '/' . basename( __FILE__, '.php' ) );

    // We have a stored credentials file, try using the data from there first
    if ( file_exists( $credentialsPath ) ) {
        $accessToken = json_decode( file_get_contents( $credentialsPath ), true );
    }

    // No stored credentials found, we'll need to request them with OAuth
    else {

        // Request authorization from the user
        $authUrl = $client->createAuthUrl();
        if ( ! isset( $_GET['code'] ) ) {
            header( "Location: $authUrl", true, 302 );
            exit;
        }

        // The authorization code is sent to the callback URL as a GET parameter.
        // We use this "authorization code" to generate an "access token". The
        // "access token" is what's effectively used as a private API key.
        $authCode = $_GET['code'];
        $accessToken = $client->fetchAccessTokenWithAuthCode( $authCode );

        // Create credentials.json if it doesn't already exist (first run)
        if ( ! file_exists( dirname( $credentialsPath ) ) ) {
            mkdir( dirname( $credentialsPath ), 0700, true );
        }

        // Save the $accessToken object to the credentials.json file for re-use
        file_put_contents( $credentialsPath, json_encode( $accessToken ) );
    }

    // Provide client with API access token
    $client->setAccessToken( $accessToken );

    // If the $accessToken is expired then we'll need to refresh it
    if ( $client->isAccessTokenExpired() ) {
        $client->fetchAccessTokenWithRefreshToken( $client->getRefreshToken() );
        file_put_contents( $credentialsPath, json_encode( $client->getAccessToken() ) );
    }

    return $client;
}

// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Sheets( $client );

// Get values from a spreadheet and print
// https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get
$spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms';
$range = 'Class Data!A2:E';
$response = $service->spreadsheets_values->get($spreadsheetId, $range);
$values = $response->getValues();

if (empty($values)) {
    print "No data found.\n";
} else {
    print "Name, Major:\n";
    foreach ($values as $row) {
        // Print columns A and E, which correspond to indices 0 and 4.
        printf("%s, %s\n", $row[0], $row[4]);
    }
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*ins 6

我得到了它的工作.我要做的就是回到Google Developer Console并删除我创建的项目.然后在制作一个新项目时,它允许我保存我的localhost网址.发生的问题是当我去添加我的localhost网址到重定向网址时,它会说这不可能.当我在点击创建按钮之前设置重定向网址时,它接受它就好了.

  • 这是因为你下载的客户端秘密json文件也需要更新.因此,如果您在没有uri的情况下创建凭据并下载json,则json没有'redirect_uris'属性.如果您然后将其添加到仪表板中,则需要重新下载客户端密钥json并将其添加到项目中. (6认同)