在C#中验证Google ID令牌

时间:2013-06-14 17:35:58

标签: c# .net authentication google-plus

我需要在ASP.NET web api验证从移动设备传递的Google ID令牌。

Google有一些示例代码here,但它依赖的是JWT NuGet包,它只是.Net 4.5(我使用的是C#/。Net 4.0)。有没有人知道没有这些包装或者自己实现了这样做的任何样品?如果没有它,使用该软件包就很难找到我需要做的事情。

3 个答案:

答案 0 :(得分:12)

根据此github issue,您现在可以使用GoogleJsonWebSignature.ValidateAsync方法验证Google签名的JWT。只需将idToken字符串传递给方法。

var validPayload = await GoogleJsonWebSignature.ValidateAsync(idToken);
Assert.NotNull(validPayload);

如果它不是有效的,它将返回null

请注意,要使用此方法,您需要先安装Google.Apis.Auth nuget。

答案 1 :(得分:1)

挑战在于验证ID令牌中的JWT证书。目前还没有一个我知道的库可以做到这一点,不需要.Net 4.5,直到.NET 4.0中有一个JWT验证解决方案,就没有一个简单的解决方案。

但是,如果您有访问令牌,则可以使用oauth2.tokeninfo查看执行验证。要使用令牌信息执行基本验证,您可以执行以下操作:

// Use Tokeninfo to validate the user and the client.
var tokeninfo_request = new Oauth2Service().Tokeninfo();
tokeninfo_request.Access_token = _authState.AccessToken;
var tokeninfo = tokeninfo_request.Fetch();
if (userid == tokeninfo.User_id
    && tokeninfo.Issued_to == CLIENT_ID)
{
    // Basic validation succeeded
}
else
{
    // The credentials did not match.
}

从Google OAuth2 API返回的信息会告诉您有关特定令牌的更多信息,例如发出的客户端ID及其到期时间。

注意您不应该传递访问令牌,而应该在交换一次性代码以检索访问令牌之后进行此检查。

答案 2 :(得分:1)

还需要传递

ClientId,应从Google API控制台设置。如果仅传递TokenId,则GoogleJsonWebSignature会引发错误。此答案是@edmundpie答案的补充

var settings = new GoogleJsonWebSignature.ValidationSettings()
{
 Audience = new List<string>() { "[Placeholder for Client Id].apps.googleusercontent.com" }
};

var validPayload = await GoogleJsonWebSignature.ValidateAsync(model.ExternalTokenId, settings);