如何在没有回调(Intranet)的情况下为刷新令牌交换Google一次性授权代码?

时间:2016-03-08 14:04:38

标签: google-api google-oauth google-api-php-client google-oauth2

我正在使用基于Intranet的应用程序,我想使用Google服务。目前,我已经成功实施了Google身份验证,并使用了#34;登录网站"使用JavaScript客户端身份验证。我的用户现在可以登录或注册Google帐户。

现在,我想使用Google API与我的用户一起创建和共享Google表格。这些文档将使用特定的Google帐户创建,然后与我的用户共享。

这就是为什么我想使用此服务器幻灯片流来获取一次性授权代码并将其交换为刷新令牌: https://developers.google.com/identity/sign-in/web/server-side-flow

Google hybrid Server-side flow

此刷新令牌将存储在我的数据库中,允许我代表此离线用户使用Google服务。

使用JavaScript库,我能够获得使用AJAX请求发送到服务器的一次性授权代码。

auth2.grantOfflineAccess({'redirect_uri': 'postmessage'}).then(grantOfflineAccessCallback);

var grantOfflineAccessCallback = function(authResult) {
    var auth_code = authResult.code;

    // Exchange the one-time authorization code for tokens
    $.post(...);
}

在服务器端,我使用Google API PHP客户端(v2.0.0-RC6)获取访问和刷新令牌。

$this->client = new Google_Client();
$this->client->setClientId($this->clientId);
$this->client->setClientSecret($this->clientSecret);
$this->client->setAccessType('offline');
$this->client->setApprovalPrompt('force');

$response = $this->client->fetchAccessTokenWithAuthCode($oneTimeCode);

我无法交换授权码。

Client error: `POST https://www.googleapis.com/oauth2/v4/token` resulted in a `400 Bad Request` response:
{
 "error": "invalid_request",
 "error_description": "Missing parameter: redirect_uri"
}

在此页面上,我们可以阅读:

  

在服务器上,交换auth代码以进行访问并刷新令牌。   使用访问令牌代表用户调用Google API。

在JAVA示例代码中:

REDIRECT_URI: // Specify the same redirect URI that you use with your web
              // app. If you don't have a web version of your app, you can
              // specify an empty string.

因为我正在处理的应用程序是一个Intranet应用程序,所以我尝试在调用fetchAccessTokenWithAuthCode()方法之前为此redirect_uri参数指定一个空字符串:

$this->client->setRedirectUri('');

...导致Redirect URI must be absolute

我们可以在没有回调网址的情况下使用此混合服务器幻灯片流吗?

我的问题有解决办法吗?

谢谢,

编辑:

redirect_uri是用户登录后重定向到的位置。此URL必须在Google Project(开发人员控制台)中注册。 所以redirect_uri不是回调......!

问题现在解决了:

$this->client->setRedirectUri('http://same.url.as.in.developers.console/');

0 个答案:

没有答案