我需要在我的 ASP.NET Web api 上验证从移动设备传递的 Google ID 令牌。
谷歌在这里有一些示例代码,但它依赖于一个 JWT NuGet 包,它只是 .Net 4.5(我使用的是 C#/.Net 4.0)。有没有人知道任何没有这些软件包的样本或自己实现了这一点?这个包的使用使得我很难弄清楚没有它我需要做什么。
我需要在我的 ASP.NET Web api 上验证从移动设备传递的 Google ID 令牌。
谷歌在这里有一些示例代码,但它依赖于一个 JWT NuGet 包,它只是 .Net 4.5(我使用的是 C#/.Net 4.0)。有没有人知道任何没有这些软件包的样本或自己实现了这一点?这个包的使用使得我很难弄清楚没有它我需要做什么。
根据这个 github问题,您现在可以使用GoogleJsonWebSignature.ValidateAsync
方法来验证 Google 签名的 JWT。只需将idToken
字符串传递给方法。
var validPayload = await GoogleJsonWebSignature.ValidateAsync(idToken);
Assert.NotNull(validPayload);
如果它不是一个有效的,它将返回null
。
请注意,要使用此方法,您需要先安装Google.Apis.Auth nuget。
挑战是验证 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 以及它的到期时间。
注意您不应该传递访问令牌,而应该在交换一次性代码以检索访问令牌后执行此检查。
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);