JWT令牌尚未生效

时间:2018-05-07 17:13:09

标签: angular jwt google-signin

我的角网页应用中有一个谷歌登录按钮。 登录成功后,我会存储用户个人资料和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. 大多数情况下,当我尝试使用google验证id-token时,我的API会抛出“JWT尚未生效”错误。它似乎每4次尝试一次。
  2. 在导航到'companyList'
  3. 时没有点击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尚未生效的错误,我的公司列表页面加载数据很好。

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

    任何想法2代码之间的区别是什么?

1 个答案:

答案 0 :(得分:2)

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

的原因

要修复此问题,您可以将服务器的时间与Google服务器时间同步。 Google doc如何执行此操作是https://developers.google.com/time/