AWS API网关自定义授权程序

时间:2017-04-10 10:13:08

标签: amazon-web-services aws-lambda aws-api-gateway

我正在尝试通过java SDK实现自定义授权器lambda函数。有人可以告诉我lambda函数预期的JSON响应的确切格式。另外,我应该以哪种格式返回输出(JSON对象或策略对象)。

{
    "policyDocument": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Resource": [
          "arn:aws:execute-api:us-east-1:1234567:myapiId/staging/POST/*"
        ],
        "Effect": "Allow"
      }
    ]
    },
    "principalId": "User123"
}

这是我在JSONObject格式的输出中提供的格式,但是收到错误

  

Mon Apr 10 09:42:35 UTC 2017:终点请求正文   变换:   {"类型":" TOKEN"" authorizationToken":" ABC123"" methodArn":" ARN:AWS:执行-API:AP-东南-1:007183653813:ohlqxu9p57 /空/ GET /"}   2017年4月10日星期一09:42:36由于配置,执行失败   错误:授权程序功能因响应正文失败:   {" errorMessage":" JSON序列化期间发生错误   响应"" ERRORTYPE":"了java.lang.RuntimeException""堆栈跟踪":[],"原因":{& #34;的errorMessage":" com.fasterxml.jackson.databind.JsonMappingException:   JsonObject(通过参考链:   com.google.gson.JsonObject [\" asString \"])"" ERRORTYPE":" java.io.UncheckedIOException"&# 34;栈跟踪":[],"原因" {"的errorMessage":"的JSONObject   (通过参考链:   com.google.gson.JsonObject [\" asString \"])"" ERRORTYPE":" com.fasterxml.jackson.databind.JsonMappingException&#34 ;,"堆栈跟踪":[" com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:210)"" com.fasterxml.jackson.databind .JsonMappingException.wrapWithPath(JsonMappingException.java:177)"" com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:199)"&#34 ; com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:683)"" com.f   [截止日期] 2017年4月10日星期一09:42:36   AuthorizerConfigurationException

任何帮助都会很棒。提前致谢

3 个答案:

答案 0 :(得分:0)

AWS开发人员指南提供了lambda函数输入/输出的良好示例:http://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html

答案 1 :(得分:0)

您面临的问题是Lambda框架相关。

本质上,Lambda将调用处理函数并传递序列化的JSON。

public class LambdaCustomAuthorizer implements RequestHandler<AuthorizationRequestDO, Object> {


public Object handleRequest(AuthorizationRequestDO input, Context context) { }

}

当您使用自定义授权程序时,API网关将遵循JSON传递给您的lambda函数:

{     “类型”:“令牌”,     “authorizationToken”: “”, “methodArn”: “阿尔恩:AWS:执行-API ::: ///” }

你应该有一个自定义DO AuthorizationRequestDO

这是一个POJO ::

public class AuthorizationRequestDO {

 String authorizationToken;
 String methodArn;      


public String getAuthorizationToken() {
    return authorizationToken;
}
public void setAuthorizationToken(String authorizationToken) {
    this.authorizationToken = authorizationToken;
}
public String getMethodArn() {
    return methodArn;
}
public void setMethodArn(String methodArn) {
    this.methodArn = methodArn;
}

@Override
public String toString() {
    return "AuthorizationRequestDO [authorizationToken=" + authorizationToken + ", methodArn=" + methodArn
            + ", getAuthorizationToken()=" + getAuthorizationToken() + ", getMethodArn()=" + getMethodArn() + "]";
}   

}

答案 2 :(得分:0)

您的Resource媒体资源应为string个{/ p}。

{
    "policyDocument": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:us-east-1:1234567:myapiId/staging/POST/*",
        "Effect": "Allow"
      }
    ]
    },
    "principalId": "User123"
}