Google Analytics(分析)OAuth2:如何解决错误:“redirect_uri_mismatch”? [英] Google Analytics OAuth2: How to solve error: "redirect_uri_mismatch"?

查看:296
本文介绍了Google Analytics(分析)OAuth2:如何解决错误:“redirect_uri_mismatch”?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图让这个例子工作:



奇怪的是,如果我导航到上面包含的链接错误消息访问......以更新授权..,我收到此错误消息:OAuth客户端不存在





如果我点击我唯一可用的客户端ID,我可以浏览以查看我将在下面截图的URI好:



正如您所看到的,在Authorized Javascript起源下,我有 http:// localhost 列出,并在授权的重定向URI下,我有我的活网站,后面跟着oauthc2callback.php文件扩展名。

我不明白如何摆脱我遇到的错误。我试过替换URI并放入不同的JavaScript起源。



另外,出于某种原因,在上一张截图中,它表示我无权编辑此OAuth客户端,但可以进行编辑。



我的index.php代码:

 <?php 
//载入Google API PHP客户端库。
require_once'../vendor/autoload.php';

//开始一个会话以保存凭据。
session_start();

//创建客户端对象并从您从开发者控制台下载的client_secretes.json中设置授权配置
//。
$ client = new Google_Client();
$ client-> setAuthConfigFile('../ config / client_secrets.json');
$ client-> addScope('https://www.googleapis.com/auth/analytics.readonly');

//如果用户已经授权此应用,则获取访问令牌
//否则重定向以要求用户授权访问Google Analytics。
if(isset($ _ SESSION ['access_token'])&& $ _SESSION ['access_token']){
//在客户端设置访问令牌。
$ client-> setAccessToken($ _ SESSION ['access_token']);

//创建一个授权的分析服务对象。
$ analytics =新Google_Service_Analytics($ client);

//获取授权用户的第一个视图(配置文件)ID。
$ profile = getFirstProfileId($ analytics);

//从Core Reporting API获取结果并打印结果。
$ results = getResults($ analytics,$ profile);
printResults($ results);
} else {
$ redirect_uri ='http://'。 $ _SERVER ['HTTP_HOST']。 /oauth2callback.php;
header('Location:'。filter_var($ redirect_uri,FILTER_SANITIZE_URL));



函数getFirstprofileId(& $ analytics){
//获取用户的第一个视图(配置文件)ID。

//获取授权用户的帐户列表。
$ accounts = $ analytics-> management_accounts-> listManagementAccounts();
$ b $ if(count($ accounts-> getItems())> 0){
$ items = $ accounts-> getItems();
$ firstAccountId = $ items [0] - > getId();

//获取授权用户的属性列表。
$ properties = $ analytics-> management_webproperties
- > listManagementWebproperties($ firstAccountId);
$ b $ if(count($ properties-> getItems())> 0){
$ items = $ properties-> getItems();
$ firstPropertyId = $ items [0] - > getId();

//获取授权用户的视图列表(配置文件)。
$ profiles = $ analytics-> management_profiles
- > listManagementProfiles($ firstAccountId,$ firstPropertyId); $(

)if(count($ profiles-> getItems())> 0){
$ items = $ profiles-> getItems();

//返回第一个视图(配置文件)ID。
return $ items [0] - > getId();

} else {
抛出新的异常('找不到此用户的视图(配置文件)'。
}
} else {
抛出新的异常('没有找到该用户的属性。');
}
} else {
抛出新的异常('没有为这个用户找到帐户');



函数getResults(& $ analytics,$ profileId){
//调用Core Reporting API并查询会话数
//过去七天。
return $ analytics-> data_ga-> get(
'ga:'。$ profileId,
'7daysAgo',
'今天',
'ga :会话);
}

function printResults(& $ results){
//解析来自Core Reporting API的响应并打印
//配置文件名称和总会话。
if(count($ results-> getRows())> 0){

//获取配置文件名称。
$ profileName = $ results-> getProfileInfo() - > getProfileName();

//获取第一行中第一个条目的条目。
$ rows = $ results-> getRows();
$ sessions = $ rows [0] [0];

//打印结果。
print< p>找到第一个视图(配置文件):$ profileName< / p>;
print< p>会话总数:$ sessions< / p>;
} else {
print< p>找不到结果。< / p>;


我的代码是oauth2callback.php:

 <?php 
require_once'../vendor/autoload.php';

//开始一个会话以保存凭据。
session_start();

//创建客户端对象并从您从Developers Console下载的client_secrets.json中设置授权配置
//。
$ client = new Google_Client();
$ client-> setAuthConfigFile('../ config / client_secrets.json');
$ client-> setRedirectUri('http://'。$ _SERVER ['HTTP_HOST']。'/oauth2callback.php');
$ client-> addScope('https://www.googleapis.com/auth/analytics.readonly');

//处理来自服务器的授权流程。
if(!isset($ _ GET ['code'])){
$ auth_url = $ client-> createAuthUrl();
header('Location:'。filter_var($ auth_url,FILTER_SANITIZE_URL));
} else {
$ client-> authenticate($ _ GET ['code']);
$ _SESSION ['access_token'] = $ client-> getAccessToken();
$ redirect_uri ='http://'。 $ _SERVER ['HTTP_HOST']。 /;
header('Location:'。filter_var($ redirect_uri,FILTER_SANITIZE_URL));
}

所有这些代码都取自第一个网站示例,除了少数少量补充,以使其与我的系统匹配。



任何人都知道我可以摆脱这个错误吗?我在做什么错了? 解决方案

请记住,就Google而言,你的服务器是敌对的, 友好的,你必须明确白名单的每一个可能的OAuth调用谷歌来源。



谷歌是一个clubbouncer,一个大,丑,不可动摇的保镖与一个客人名单说到您的申请中:我只会处理您的请求,如果您的确切姓名或编号在列表中



您是否尝试过包括 localhost ,但所有其他可能的起源?



您必须列出urlroot的所有可能变体,包括显式IP。

  http://www.example.com 
http://example.com
https://example.com
https://www.example.com
http://222.111.0.111
...

不要忘记包括



https://accounts.google.com:443


I'm trying to get this example to work: https://developers.google.com/analytics/devguides/config/mgmt/v3/quickstart/web-php#enable

The error I'm getting is "Error: redirect_uri_mismatch" .

In order to install the google api resources, I used composer with this command:

php composer.phar require google/apiclient:^2.0.0@RC

This installed the "vendor" folder in my root site folder. My index.php and oauth2callback.php files are located in the "public_html" folder.

Here's a screenshot of my error when going to my site:

The weird thing is that if I navigate to the link above that's included in the error message "Visit ...... to update the authorized..", I get this error message: " The OAuth Client Does Not Exist "

If I click on my only available Client ID, I can navigate to see the URI's which I'll screenshot below as well:

As you can see, under Authorized Javascript origins, I have http://localhost listed, and under authorized redirect URIs, I have my live site followed by the "oauthc2callback.php" file extension.

I don't understand how to get rid of the error I'm getting. I've tried replacing the URI's and putting in different JavaScript origins.

Also, for some reason on that last screenshot, it says that I don't have permission to edit this OAuth client, but I can make edits.

The code I have for index.php:

<?php
// Load the Google API PHP Client Library.
require_once '../vendor/autoload.php';

// Start a session to persist credentials.
session_start();

// Create the client object and set the authorization configuration
// from the client_secretes.json you downloaded from the developer console.
$client = new Google_Client();
$client->setAuthConfigFile('../config/client_secrets.json');
$client->addScope('https://www.googleapis.com/auth/analytics.readonly');

// If the user has already authorized this app then get an access token
// else redirect to ask the user to authorize access to Google Analytics.
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
    // Set the access token on the client.
    $client->setAccessToken($_SESSION['access_token']);

    // Create an authorized analytics service object.
    $analytics = new Google_Service_Analytics($client);

    // Get the first view (profile) id for the authorized user.
    $profile = getFirstProfileId($analytics);

    // Get the results from the Core Reporting API and print the results.
    $results = getResults($analytics, $profile);
    printResults($results);
} else {
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}


function getFirstprofileId(&$analytics) {
    // Get the user's first view (profile) ID.

    // Get the list of accounts for the authorized user.
    $accounts = $analytics->management_accounts->listManagementAccounts();

    if (count($accounts->getItems()) > 0) {
        $items = $accounts->getItems();
        $firstAccountId = $items[0]->getId();

        // Get the list of properties for the authorized user.
        $properties = $analytics->management_webproperties
        ->listManagementWebproperties($firstAccountId);

        if (count($properties->getItems()) > 0) {
            $items = $properties->getItems();
            $firstPropertyId = $items[0]->getId();

            // Get the list of views (profiles) for the authorized user.
            $profiles = $analytics->management_profiles
            ->listManagementProfiles($firstAccountId, $firstPropertyId);

            if (count($profiles->getItems()) > 0) {
                $items = $profiles->getItems();

                // Return the first view (profile) ID.
                return $items[0]->getId();

            } else {
                throw new Exception('No views (profiles) found for this user.');
            }
        } else {
            throw new Exception('No properties found for this user.');
        }
    } else {
        throw new Exception('No accounts found for this user.');
    }
}

function getResults(&$analytics, $profileId) {
    // Calls the Core Reporting API and queries for the number of sessions
    // for the last seven days.
    return $analytics->data_ga->get(
    'ga:' . $profileId,
    '7daysAgo',
    'today',
    'ga:sessions');
}

function printResults(&$results) {
    // Parses the response from the Core Reporting API and prints
    // the profile name and total sessions.
    if (count($results->getRows()) > 0) {

        // Get the profile name.
        $profileName = $results->getProfileInfo()->getProfileName();

        // Get the entry for the first entry in the first row.
        $rows = $results->getRows();
        $sessions = $rows[0][0];

        // Print the results.
        print "<p>First view (profile) found: $profileName</p>";
        print "<p>Total sessions: $sessions</p>";
    } else {
        print "<p>No results found.</p>";
    }
}

The code I have for "oauth2callback.php":

<?php
require_once '../vendor/autoload.php';

// Start a session to persist credentials.
session_start();

// Create the client object and set the authorization configuration
// from the client_secrets.json you downloaded from the Developers Console.
$client = new Google_Client();
$client->setAuthConfigFile('../config/client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope('https://www.googleapis.com/auth/analytics.readonly');

// Handle authorization flow from the server.
if (! isset($_GET['code'])) {
    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

All of this code was taken from the first website example, except with a few minor additions to make it match my system.

Anyone know how I can get rid of this error? What am I doing wrong?

解决方案

Remember, as far as Google is concerned, "your" server is hostile until you name it "friendly", you must explicitly whitelist every possible source of an OAuth call TO Google.

Google is a clubbouncer, a big, ugly, unmovable bouncer with a a guest list saying to your application: "I will only deal with your request if your exact name OR id is on the list"

Have you tried including, not only localhost, but all other possible origins?

You must list every possible variation of url "root", including explicit IPs.

http://www.example.com
http://example.com
https://example.com
https://www.example.com
http://222.111.0.111
...

dont forget to include

https://accounts.google.com:443

这篇关于Google Analytics(分析)OAuth2:如何解决错误:“redirect_uri_mismatch”?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆