【发布时间】:2018-03-13 00:34:31
【问题描述】:
我有几天时间尝试使用带有 auth0 服务的自定义授权器来保护我的 API 网关。我有我的 lambda 来验证我的不记名令牌,如果我在 AWS 控制台中调用它,Lambda 确实可以工作,并且当我创建自定义授权方时,我可以使用不记名令牌成功测试。
当我尝试将授权方附加到我的 API 网关方法并使用邮递员和 auth0 提供的令牌测试请求时,它总是返回 401 状态代码。我在 CloudWatch 和授权 Lambda 中阅读了我的日志,每当我发出 HTTP 请求时它都不会触发。我正在关注本教程: https://auth0.com/docs/integrations/aws-api-gateway/custom-authorizers/
这是我的授权 lambda 代码:
处理程序:
'use strict';
let jwtManager = require("./jwt_manager");
module.exports.authenticate = (event, context, callback) => {
jwtManager.validate(event, function (error, data) {
if (error) {
if (!error) {
context.fail("Unhandled error");
}
context.fail(error);
}
else {
console.log("SUCCEED");
context.succeed(data);
}
});
};
这是 jwtManager:
"use strict";
require("dotenv").config({ silent: true });
let jwksClient = require("jwks-rsa");
let jwt = require("jsonwebtoken");
module.exports.validate = function(params, callback) {
var token = validateParams(params);
var client = jwksClient({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 10,
jwksUri: process.env.JWKS_URI
});
var decodedJwt = jwt.decode(token, { complete: true });
var kid = decodedJwt.header.kid;
client.getSigningKey(kid, function(error, data) {
if (error) {
console.log(error);
callback(error);
} else {
var signingKey = data.publicKey || data.rsaPublicKey;
jwt.verify(
token,
signingKey,
{ audience: process.env.AUDIENCE, issuer: process.env.ISSUER },
function(error, decoded) {
if (error) {
console.log("ERROR");
console.log(error);
callback(error);
}
else {
console.log(decoded);
var response = {
principalId: decoded.sub,
policyDocument: getPolicyDocument("Allow", params.methodArn),
context: {
scope: decoded.scope
}
}
console.log(response);
console.log(response.policyDocument);
callback(null, response);
}
}
);
}
});
};
function validateParams(params) {
var token;
if (!params.type || params.type !== "TOKEN") {
throw new Error("Expected 'event.type' parameter to have value TOKEN");
}
var tokenString = params.authorizationToken;
if (!tokenString) {
throw new Error("Expected 'event.authorizationToken' parameter to be set");
}
var match = tokenString.match(/^Bearer (.*)$/);
if (!match || match.length < 2) {
throw new Error(
"Invalid Authorization token - '" +
tokenString +
"' does not match 'Bearer .*'"
);
}
return match[1];
}
function getPolicyDocument(effect, resource) {
var policyDocument = {};
policyDocument.Version = '2012-10-17'; // default version
policyDocument.Statement = [];
var statementOne = {};
statementOne.Action = [ 'execute-api:Invoke', 'lambda:Invoke'] ; // default action
statementOne.Effect = effect;
statementOne.Resource = resource.split('/')[0] + '/*';
policyDocument.Statement[0] = statementOne;
return policyDocument;
}
提前致谢!
【问题讨论】:
-
您是否尝试过打印政策声明并确保他们拥有正确的 ID?
-
我不确定这与我的错误有关,因为当我发出请求时 Lambda 不会触发,因此 API Gateway 永远不会收到来自 Lambda 的响应
标签: node.js amazon-web-services aws-lambda aws-api-gateway