我需要在ASP.NET web api验证从移动设备传递的Google ID令牌。
Google有一些示例代码here,但它依赖的是JWT NuGet包,它只是.Net 4.5(我使用的是C#/。Net 4.0)。有没有人知道没有这些包装或者自己实现了这样做的任何样品?如果没有它,使用该软件包就很难找到我需要做的事情。
答案 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);