0

我正在为我正在构建的 Web 应用程序创建 OpenID / oAuth2 登录过程。

我可以向 Google+ 发出授权请求。我的 redirect_uri 中返回了几个参数:

access_token = averylongstring
token_type = Bearer
expires_in = 3600
id_token = anextremelylongstring
refresh_token = 1/Jo_tXhJtL3sQTBZURWyKWwebQSjxY1Rb-7sflDC74Pw
created = 1370140758

然后我执行一个类似于以下内容的 cURL GET:

$url = 'https://www.googleapis.com/oauth2/v1/userinfo';
$curl_data = "?access_token=".$tokens['access_token']."&code=".urlencode('xxxxxxxxx.apps.googleusercontent.com')."&client_id=".urlencode('xxxxxxxxx.apps.googleusercontent.com')."&client_secret=".urlencode('xxxxxxxxx')."&redirect_uri=".urlencode('http://www.mydomain.com/oauth2callback.php')."&grant_type=authorization_code";

这给了我一个 id,我认为这是我的身份验证流程的成功结束。

那么,我在哪里丢失了我的状态变量

https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=http%3A%2F%2Fwww.mydomain.com%2Foauth2callback.php&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.login&access_type=offline&approval_prompt=force&state={%22cid%22%3A%22%22%2C%22tid%22%3A%221370142477%22%2C%22app%22%3A%22anappname%22%2C%22Provider%22%3A%22%22}

...还有我的redirect_uri?

4

1 回答 1

0

看起来有两个重定向到我的回调 url。在第一次重定向中,当用户允许访问他们的 Google 信息时,URL 变量“state”和“code”会立即发送到我的回调页面。但随后另一个调用,即最终身份验证请求,是从我的回调页面发出的,其结果只是一个没有查询字符串的干净 url。

因此,在第一次重定向到我的回调页面期间,我读取了 GET 变量,并将它们转换为 SESSION 变量。接下来,执行一个 cURL(我仍然没有这部分正确,因为我正在将 cURL 发布到:

https://accounts.google.com/o/oauth2/token

...我的 cURL 代码如下所示:

    $ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"$url");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('access_token' => $access_token,
                                                            'code' => $_REQUEST['code'],
                                                            'client_id' => 'myclientid.apps.googleusercontent.com',
                                                            'client_secret' => 'mylittlesecret',
                                                            'redirect_uri' => 'http://www.mydomain.com/oauth2callback.php',
                                                            'grant_type' => 'authorization_code',
                                                            'approval_prompt' => 'force')));

得到一个:

{ "error" : "invalid_request" }

在我的编码项目的这一部分中,我真的没有得到任何乐趣。

于 2013-06-03T15:22:50.347 回答