【问题标题】:Refresh JWT token from AWS Cognito in Angular 5?在 Angular 5 中从 AWS Cognito 刷新 JWT 令牌?
【发布时间】:2018-07-25 06:55:26
【问题描述】:

我正在通过 aws sdk cognito .net sdk 在 amazon cognito 中创建用户。当用户登录时,他们会返回 3 个令牌(IdToken、AccessToken 和 RefreshToken)。 IdToken 有效期为 1 小时。当前,当令牌过期时,用户将被重定向到登录页面。我想做的是在收到 403 回复时发送 RefreshToken,但我不确定如何在 Angular 应用程序中执行此操作?

我还假设这是我将在客户端而不是在服务器端(.net web api)处理的事情?

我目前的路线上有警卫,它们从我的服务中调用以下函数:

 loggedIn() {
    return tokenNotExpired('token');
  }

以下工作,但问题是我必须使用我的AccessKeySecretKey

refreshToken(){

    AWS.config.update({credentials:{accessKeyId:'access_id',secretAccessKey:'secret'}, region:'us-east-2'});

    const myCreds = new AWS.CognitoIdentityCredentials({IdentityPoolId:'us-east-2:identity_pool_id},{region:'us-east-2'});

   const myConfig = new AWS.Config({credentials: myCreds, region: 'us-east-2'});



   const refreshToken = JSON.parse(localStorage.getItem('rToken'));
    const cognitoisp = new CognitoIdentityServiceProvider();

    const params = {
      AuthFlow: 'REFRESH_TOKEN',
      ClientId: 'client_id',
      UserPoolId: 'user_pool_id',
      AuthParameters: {
        'REFRESH_TOKEN': refreshToken
      }
    }

    cognitoisp.adminInitiateAuth(params,(err,data)=>{
      if(err) console.log(err,err.stack);

      else

      {
        this.token = data.AuthenticationResult.IdToken;
        localStorage.setItem('lcToken',JSON.stringify(this.token));
      }

    })
  }

【问题讨论】:

    标签: angular aws-cognito


    【解决方案1】:

    您的想法是正确的,一旦您获得 4xx 状态,您就可以使用刷新令牌来获得一组新的令牌。 JavaScript 中的代码是这样的:

    const AWS = require('aws-sdk')
    const cognitoisp = new AWS.CognitoIdentityServiceProvider();
    
    var params = {
      AuthFlow: 'REFRESH_TOKEN',
      ClientId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
      UserPoolId: 'region_xxxxxxxx',
      AuthParameters: {
        'REFRESH_TOKEN': 'xxxxxxxxxxxxxxxxxxxxx'
      }
    }
    
    cognitoisp.adminInitiateAuth(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });
    

    文档:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#adminInitiateAuth-property

    【讨论】:

    • 所以我基本上可以用 .NET 做同样的功能。如果我收到 401,我可以调用服务器端的 AdminInititateAuth 发送正确的标头吗?还是像你一样在这个javascript方面更好? clientId 和 UserPoolId 是否应该是私有的(我可以将它们存储在 js 中)吗?这样做是否最好在我的保护代码中发送刷新令牌?
    • 最好在客户端处理这个问题,但也可以在服务器端完成,两种方式都可以。需要注意的一点是,刷新令牌必须过期才能成功返回,如果您的令牌尚未过期,它将返回异常。
    • the refresh token has to be expired - 你是说IdToken吗?
    • 是的,我的意思是 idToken,但看起来这不是限制,您可以随时刷新
    • 好的,谢谢,我正在整理一些代码,很快就会更新我的帖子
    猜你喜欢
    • 2021-04-06
    • 2017-10-11
    • 2016-10-14
    • 2018-06-12
    • 2023-03-16
    • 2018-03-07
    • 2018-04-03
    • 2020-09-28
    • 2017-11-22
    相关资源
    最近更新 更多