使用C#验证Google ID令牌

时间:2017-05-23 17:31:04

标签: c# google-api

我目前正在创建一个用户可以通过他的Google帐户登录的网络应用程序。这适用于客户端,但我也想保护REST API调用。为此,我通过“授权”标题向每个请求发送“Google id令牌”。现在,我想在C#中验证传递的令牌是否有效。我发现有一个.NET库可以这样做,但我没有找到任何关于如何简单验证令牌的明确文档。

有没有人有这个指针?

3 个答案:

答案 0 :(得分:6)

我的答案与上面的答案相同,但有一些细节。

using Google.Apis.Auth;
using Google.Apis.Auth.OAuth2;

GoogleJsonWebSignature.Payload payload = await GoogleJsonWebSignature.ValidateAsync(Token);
...

有效负载对象包含您需要的所有信息。

答案 1 :(得分:1)

根据"Verify the integrity of the ID token" documentation,必须检查多项内容,以使id令牌有效,而不仅仅是签名。

其中之一是“ ID令牌是否等于您应用程序的客户端ID”。由于我们从未将客户端ID提供给 GoogleJsonWebSignature.ValidateAsync(token),因此我们似乎似乎需要手动对其进行检查。我假设它实际上只是在检查签名,我们需要手动进行所有其他检查。

我的第一枪:

bool valid = true;
try
{
    GoogleJsonWebSignature.Payload payload = await GoogleJsonWebSignature.ValidateAsync(Token);
    if (!payload.Audience.Equals("YOUR_CLIENT_ID_1234567890.apps.googleusercontent.com"))
        valid = false;
    if (!payload.Issuer.Equals("accounts.google.com") && !payload.Issuer.Equals("https://accounts.google.com"))
        valid = false;
    if (payload.ExpirationTimeSeconds == null)            
        valid = false;            
    else
    {
        DateTime now = DateTime.Now.ToUniversalTime();
        DateTime expiration = DateTimeOffset.FromUnixTimeSeconds((long)payload.ExpirationTimeSeconds).DateTime;
        if (now > expiration)
        {
            valid = false;
        }
    }
}
catch (InvalidJwtException e)
{
    valid = false;
}

答案 2 :(得分:0)

为了将来参考,以下验证由 Google.Apis.Auth 库内部检查,不需要额外的验证(通过设置或检查有效负载):

  • jwt 错误(空、空、太长、缺少签名)
  • 错误的算法
  • 无效签名
  • 无效的发行人
  • 无容差的签名时间

但是,以下内容需要开发人员输入才能进行验证。它们可以通过 GoogleJsonWebSignature.ValidationSettings 传递:

  • 观众
  • 托管域
  • 有容差的签名时间

来源:Google.Apis.Auth.Tests/GoogleJsonWebSignatureTests.cs

According to the docs,必须通过使用 Google 的公钥验证签名来验证令牌。还要检查 aus、iss 和 exp 声明,以及 hd 声明(如果适用)。 因此,只有 aus(和 hd)必须由开发人员明确测试。

try
{
   //...
   var validationSettings = new GoogleJsonWebSignature.ValidationSettings
   {
      Audience = new string[] { "[google-signin-client_id].apps.googleusercontent.com" }
   };

   var payload = await GoogleJsonWebSignature.ValidateAsync(idToken, validationSettings);
   //...
}
catch (InvalidJwtException ex)
{
   //...
}