不使用Cognito的AWS API网关身份验证

时间:2019-05-14 22:28:28

标签: amazon-web-services aws-lambda

我目前在一个具有自定义身份验证/授权系统的系统上工作。

我们正在迁移到AWS和Web API和lambda ... 我想重用我们目前用于授权/授权的内容。

我正在考虑一个身份验证/授权lambda,它具有一个用于登录的端点和一个用于获取特定用户角色的端点。

Web API将这2条路由路由到身份验证/授权lambda,其余路由到其他lambda。

我还需要使用JWT来跟踪对网关的调用。 在上述情况下,代币的生成/使用将在哪里发生?

在这个新的AWS网关/ lambda Universe中,有没有更好的方法来利用我们的自定义用户/角色方案?

1 个答案:

答案 0 :(得分:1)

Reza Nasiri的评论中所述,自定义/ Lambda授权者似乎是您的最佳选择。您可以在Lambda Authorizer函数中编写自定义验证逻辑,而Lambda Authorizer可以根据您的要求验证JWT令牌。使用Lambda Authorizer时,您具有完全的代码自由度,并且可以实现任何类型的逻辑,因此可以使用旧的身份验证引擎中的令牌/字符串。

根据官方documentation给出的基于令牌(字符串)的Lambda Authorizer的示例代码片段如下所示:

// A simple token-based authorizer example to demonstrate how to use an authorization token 
// to allow or deny a request. In this example, the caller named 'user' is allowed to invoke 
// a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke 
// the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty
// string, the authorizer function returns an HTTP 401 status code. For any other token value, 
// the authorizer returns an HTTP 500 status code. 
// Note that token values are case-sensitive.

exports.handler =  function(event, context, callback) {
    var token = event.authorizationToken;
    switch (token) {
        case 'allow':
            callback(null, generatePolicy('user', 'Allow', event.methodArn));
            break;
        case 'deny':
            callback(null, generatePolicy('user', 'Deny', event.methodArn));
            break;
        case 'unauthorized':
            callback("Unauthorized");   // Return a 401 Unauthorized response
            break;
        default:
            callback("Error: Invalid token"); // Return a 500 Invalid token response
    }
};

// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
    var authResponse = {};

    authResponse.principalId = principalId;
    if (effect && resource) {
        var policyDocument = {};
        policyDocument.Version = '2012-10-17'; 
        policyDocument.Statement = [];
        var statementOne = {};
        statementOne.Action = 'execute-api:Invoke'; 
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }

    // Optional output with custom properties of the String, Number or Boolean type.
    authResponse.context = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    };
    return authResponse;
}

Lambda授权器根据发生的验证结果生成IAM策略。因此,您可以根据用例生成自定义策略。