Google Oauth2 verifyIdToken返回带有效id_token的无效令牌签名

时间:2014-04-16 09:04:28

标签: google-api-php-client

我尝试使用google Oauth2 api的php客户端来验证id_token。 id_token由用户登录其Google帐户的javascript应用程序提供,我将此令牌发送到我的php api服务器,以便验证它并从我的bdd中检索正确的信息。

javascript中的登录成功,访问权限和id_token似乎正确,但是当我尝试使用Google_Client-> verifyIdToken()

进行验证时
$client = new Google_Client();
$ticket = $client->verifyIdToken(myToken);

,它返回无效的令牌签名异常(尝试使用google证书来验证令牌时失败)。

我的第一个假设是认为令牌无效,所以为了使其成为现实,我将其提交给谷歌验证网址https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=token

它返回用户信息,因此我的令牌似乎有效:

{
issuer: "accounts.google.com",
issued_to: "id",
audience: "id",
user_id: "id",
expires_in: 2149,
issued_at: 1397636222,
email: "mail",
verified_email: true
}

尝试了我能想到的一切,但无法解决这个问题。 有人能帮我吗 ?

编辑:我只传递了我在我的javascript应用上验证时获得的id_token

access_token: "ya ... Es"
authuser: "1"
client_id: "81 ... .apps.googleusercontent.com"
code: "4/9... gI"
cookie_policy: "single_host_origin"
expires_at: "1397723048"
expires_in: "3600"
g-oauth-window: Window
g_user_cookie_policy: "single_host_origin"
hd: "dmic.fr"
id_token: "ey... d8E" <====================================
issued_at: "1397719448"
num_sessions: "2"
prompt: "none"
response_type: "code token id_token gsession"
scope: "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/plus.me"
session_state: "9 ... 2162..936b"
state: ""
status: Object
token_type: "Bearer"

在某些时候我也尝试将整个access_token传递给$ client-&gt; setAccessToken()并调用$ client-&gt; verifyIdToken(),没有参数(从acess_token本身提取id_token),结果相同。

我使用的所有代码都已发布,我也尝试设置apikey,client_id,client_secret,没有结果

2 个答案:

答案 0 :(得分:1)

您提供给 verifyIdToken 函数的参数应该是一个对象,而不仅仅是一个标记字符串,但您可能想尝试不同的方法。

尝试将您在上面发布的Javascript对象中的代码属性传递到PHP客户端的身份验证功能。这应该在服务器端验证用户,并为您填充PHP客户端对象的访问令牌。然后,您可以在没有参数的情况下调用 verifyIdToken 。像这样:

$client = new Google_Client();

// Setup Client Id and secret
...

//Authenticate client with the code posted via javascript
$client->authenticate($code);

// Verify the id token
$verifiedToken = $client->verifyIdToken();

您可能还需要更新Google API PHP库,我认为他们最近更改了从这些API返回的对象的格式。

答案 1 :(得分:1)

我有类似的问题,我从oauth2client获得了“无效的令牌签名”错误,但它与tokeninfo API调用一起使用。

在我的情况下,它可能是由oauth2client使用的加密lib引起的,因为当我用pyopenssl 0.15.1替换pycrypto 2.6时问题消失了。可能是PyCrypto bug?

编辑: 是的,经过验证,这是一个PyCrypto错误。它已在20小时前关闭:D

devel version