如何从服务器上的移动应用程序验证未经过身份验证的用户?

时间:2016-07-20 01:51:45

标签: amazon-web-services jwt access-token aws-lambda aws-api-gateway

我的目标:拥有一个不需要用户登录的移动应用。让这些未经身份验证的用户点击我的服务器。

我拥有的内容:我的服务器正在使用AWS API Gateway / AWS Lambda设置。我用于AWS API Gateway的自定义授权程序是使用此example设计的。我还粘贴了以下示例中的代码(A)

我的问题:从下面的代码块(A)中,我得到了应该使用JWT的印象。 如何我可以使用JWT在这些令牌过期时验证未经身份验证的用户?如果JWT不是最好用的,那会是什么?

谢谢!

(A)

var nJwt = require('njwt');
var AWS = require('aws-sdk');
var signingKey = "CiCnRmG+t+ BASE 64 ENCODED ENCRYPTED SIGNING KEY Mk=";

exports.handler = function(event, context) {
   console.log('Client token: ' + event.authorizationToken);
   console.log('Method ARN: ' + event.methodArn);
   var kms = new AWS.KMS();

  var decryptionParams = {
     CiphertextBlob : new Buffer(signingKey, 'base64')
  }

  kms.decrypt(decryptionParams, function(err, data) {
  if (err) {
    console.log(err, err.stack);
    context.fail("Unable to load encryption key");
  } else {
    key = data.Plaintext;

  try {
    verifiedJwt = nJwt.verify(event.authorizationToken, key);
    console.log(verifiedJwt);

    // parse the ARN from the incoming event
    var apiOptions = {};
    var tmp = event.methodArn.split(':');
    var apiGatewayArnTmp = tmp[5].split('/');
    var awsAccountId = tmp[4];
    apiOptions.region = tmp[3];
    apiOptions.restApiId = apiGatewayArnTmp[0];
    apiOptions.stage = apiGatewayArnTmp[1];

    policy = new AuthPolicy(verifiedJwt.body.sub, awsAccountId, apiOptions);

    if (verifiedJwt.body.scope.indexOf("admins") > -1) {
       policy.allowAllMethods();
    } else {
      policy.allowMethod(AuthPolicy.HttpVerb.GET, "*");
      policy.allowMethod(AuthPolicy.HttpVerb.POST, "/users/" + verifiedJwt.body.sub);
    }

    context.succeed(policy.build());

  } catch (ex) {
    console.log(ex, ex.stack);
    context.fail("Unauthorized");
  }
}
});
};

1 个答案:

答案 0 :(得分:0)

  

我的问题:从下面的代码块(A)中,我得到的印象是我   应该使用JWT。如何使用JWT验证未经身份验证的用户   当这些代币到期时?如果JWT不是最好用的,那是什么   会是吗?

为什么需要进行任何验证?如果您想允许对API进行未经身份验证的访问,您应该这样做并省去一些努力。

更新

如果您想限制访问不要求用户登录,您可能需要考虑使用Cognito Identity。它支持未经身份验证的身份以及通过Cognito Your User Pools或其他联合提供程序迁移到经过身份验证的访问。值得注意的是,如果你走这条路线,你会想要在你的应用程序中正确保护/隐藏你的身份池ID,以尽量减少它被提取的机会。

使用Cognito Identity,您可以使用标准签名版本4获取AWS凭据以对API的请求进行签名,并避免管理自定义授权程序的成本和开销。

相关问题