【问题标题】:JWT token not yet validJWT 令牌尚未生效
【发布时间】:2018-10-17 13:29:00
【问题描述】:

我的 Angular Web 应用程序中有一个 google 登录按钮。 成功登录后,我存储用户配置文件和 id-token。 id-token 设置在我发送到自定义 api 的每个请求标头中。

我目前遇到以下代码的 2 个问题:

onGoogleSignInSuccess(event: GoogleSignInSuccess) {
var profile = event.googleUser.getBasicProfile();
var id_token = event.googleUser.getAuthResponse().id_token;

// store google user data in local storage
localStorage.setItem('googleUserProfile', JSON.stringify(profile));
localStorage.setItem('googleIdToken', JSON.stringify(id_token));

// check user's email address exist in Felix
this.userService.getUserByEmail(profile.getEmail()).subscribe(InUser => {
  this.globalService.setCurrentUser(InUser);
  this.router.navigate(['companylist']);
}, error => {
  this.errorLoggingIn = true;
  this.errorCode = error.status;
  console.log('error logging in: ' + JSON.stringify(error));
});
}
  1. 大多数情况下,我的 API 在尝试使用 google 验证 id-token 时会抛出“JWT not yet valid”错误。它似乎每 4 次尝试一次。
  2. 导航到“companyList”时,它没有点击 ngOnInit

但是,当我使用 npm 模块 sngular5-social-auth 并实现以下代码时:

public socialSignIn(socialPlatform: string) {
let socialPlatformProvider;
socialPlatformProvider = GoogleLoginProvider.PROVIDER_ID;

this.socialAuthService.signIn(socialPlatformProvider).then(
  (userData) => {
    console.log(socialPlatform + " sign in data : ", userData);
    // store google user data in local storage
    localStorage.setItem('currentGoogleUserData', JSON.stringify(userData));

    this.userService.getUserByEmail(userData.email).subscribe(InUser => {
      this.globalService.setCurrentUser(InUser);
      this.router.navigate(['companylist']);
    }, error => {
      this.errorLoggingIn = true;
      this.errorCode = error.status;
      console.log('error logging in: ' + JSON.stringify(error));
    });
  }
);
}

似乎一切正常。我没有收到 JWT not yet valid 错误,而且我的公司列表页面可以正常加载数据。

我决定使用选项 1,因为我获得了默认的 google 登录按钮。

任何想法这两个代码之间的区别是什么?

【问题讨论】:

  • stackoverflow.com/questions/49696001/…。如果身份验证代码流量较低,则可以轻松修复一小段时间。我没有查看 angular5-social-auth 的来源,但他们可能实现了自定义时钟,这可以避免您在直接调用 API 时遇到的问题。

标签: angular jwt google-signin


【解决方案1】:

问题是您的服务器时间与 Google 服务器时间不同。当您验证从谷歌收到的令牌时,该令牌可能会在 1 或 n 秒内有效。这就是为什么你会收到错误JWT not yet valid

要修复它,您可以将服务器时间与谷歌服务器时间同步。谷歌文档如何做到这一点是https://developers.google.com/time/

【讨论】:

    【解决方案2】:

    您可以按照 google 配置系统时间,或者如果您的计算机是域的一部分并且您不想更改域控制器配置,那么您可以在 Validateasync 方法中传递一个时钟对象,如下所示:

    var googleUser = await GoogleJsonWebSignature.ValidateAsync(token, new GoogleJsonWebSignature.ValidationSettings()
                {
                    Clock = new clock(),
                    Audience = new[] { "your client id" }
                });
        
    

    为此,您需要创建一个实现IClock接口的类,如下所示:

     public class clock : IClock
            {
                public DateTime Now => DateTime.Now.AddMinutes(5);
        
                public DateTime UtcNow => DateTime.UtcNow.AddMinutes(5);
            }
    

    在这里,您可以相应地设置时间,就像我的系统时间是 5 分钟一样。在google时间之前,我会加5分钟,然后你的token就会成功验证。

    要查看谷歌时间,您可以使用 JwtSecurityTokenHandler 类,如:

    var handler = new JwtSecurityTokenHandler();
    var tokenS = handler.ReadToken(token) as JwtSecurityToken;
    

    在 tokenS 中,您将拥有一个提供 UTC 时间的属性,如果您想要本地时间,那么您可以在该属性上使用 toLocal() 方法并将该时间与您的系统时间进行比较。

    【讨论】:

      猜你喜欢
      • 2017-11-24
      • 2020-05-08
      • 2023-01-27
      • 2021-04-13
      • 2017-11-01
      • 2018-08-29
      • 2021-07-29
      • 2016-04-22
      相关资源
      最近更新 更多