在c#中验证Google ID令牌

本文关键字:ID 令牌 Google 验证 | 更新日期: 2023-09-27 18:18:21

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

谷歌这里有一些示例代码,但它依赖于JWT NuGet包,它是。net 4.5仅(我使用c#/。Net 4.0)。有没有人知道没有这些包装的样品可以做到这一点,或者自己实现了这一点?这个包的使用使我很难弄清楚没有它我需要做什么。

在c#中验证Google ID令牌

根据这个github问题,您现在可以使用GoogleJsonWebSignature.ValidateAsync方法来验证google签名的JWT。只需将idToken字符串传递给方法。

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

如果不是有效的,则返回null

注意,要使用此方法,您需要先安装google . api . auth nuget。

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);

挑战在于验证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以及它的过期时间。

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