14

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

谷歌在这里有一些示例代码,但它依赖于一个 JWT NuGet 包,它只是 .Net 4.5(我使用的是 C#/.Net 4.0)。有没有人知道任何没有这些软件包的样本或自己实现了这一点?这个包的使用使得我很难弄清楚没有它我需要做什么。

4

3 回答 3

24

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

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

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

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

于 2018-03-27T07:27:07.833 回答
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 以及它的到期时间。

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

于 2013-06-15T03:34:25.810 回答
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);
于 2020-06-29T03:48:47.103 回答