Dans Lambda Authorizer d'API Gateway (Rest API), [Renvoyez le JSON spécifié](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-lambda-authorizer] dans la réponse de Lambda -output.html) Doit être.
Qu'est-ce que Lambda Authorizer? Cliquez ici [https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html).
Avec Node.js, vous pouvez renvoyer JSON tel qu'il est. C'est pratique.
exports.handler = async (event) => {
console.log(JSON.stringify(event, null, 4));
return {
"principalId": "1234",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": event.methodArn
}
]
}
};
};
Dans le cas de Java, il ne peut pas être retourné par JSON et le renvoi de JSON sous forme de chaîne ne fonctionne pas. Il existe deux méthodes, l'une consiste à utiliser Map et l'autre à utiliser la classe POJO.
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class MapLambdaAuthorizer implements RequestHandler<Map<String, Object>, Map<String, Object>> {
@Override
public Map<String, Object> handleRequest(Map<String, Object> event, Context lambdaContext) {
Map<String, Object> response = new HashMap<String, Object>();
response.put("principalId", "1234");
Map<String, Object> policyDocument = new HashMap<String, Object>();
policyDocument.put("Version", "2012-10-17");
Map<String, String> statement = new HashMap<>();
statement.put("Action", "execute-api:Invoke");
statement.put("Effect", "Allow");
statement.put("Resource", (String) event.get("methodArn"));
policyDocument.put("Statement", Arrays.asList(statement));
response.put("policyDocument", policyDocument);
Map<String, String> context = new HashMap<String, String>();
context.put("now", new Date().toString());
response.put("context", context);
return response;
}
}
https://github.com/kazfuku/apigateway-java-lambda-authorizer/blob/master/lambda/authorizer/src/main/java/com/kazfuku/aws/MapLambdaAuthorizer.java
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class PojoLambdaAuthorizer implements RequestHandler<Map<String, Object>, AuthorizerResponse> {
@Override
public AuthorizerResponse handleRequest(Map<String, Object> event, Context lambdaContext) {
AuthorizerResponse response = new AuthorizerResponse();
response.setPrincipalId("1234");
Map<String, Object> policyDocument = new HashMap<>();
policyDocument.put("Version", "2012-10-17");
Map<String, String> statement = new HashMap<>();
statement.put("Action", "execute-api:Invoke");
statement.put("Effect", "Allow");
statement.put("Resource", (String) event.get("methodArn"));
policyDocument.put("Statement", Arrays.asList(statement));
response.setPolicyDocument(policyDocument);
Map<String, String> context = new HashMap<>();
context.put("now", new Date().toString());
response.setContext(context);
return response;
}
}
https://github.com/kazfuku/apigateway-java-lambda-authorizer/blob/master/lambda/authorizer/src/main/java/com/kazfuku/aws/PojoLambdaAuthorizer.java
import java.util.Map;
public class AuthorizerResponse {
private String principalId;
public void setPrincipalId(String principalId) {
this.principalId = principalId;
}
public String getPrincipalId() {
return this.principalId;
}
private Map<String, Object> policyDocument;
public void setPolicyDocument(Map<String, Object> policyDocument) {
this.policyDocument = policyDocument;
}
public Map<String, Object> getPolicyDocument() {
return this.policyDocument;
}
private Map<String, String> context;
public Map<String, String> getContext() {
return context;
}
public void setContext(Map<String, String> context) {
this.context = context;
}
}
https://github.com/kazfuku/apigateway-java-lambda-authorizer/blob/master/lambda/authorizer/src/main/java/com/kazfuku/aws/AuthorizerResponse.java
Si vous voulez en faire POJO
policyDocument.put("Version", "2012-10-17");
statement.put("Action", "execute-api:Invoke");
C'est désagréable si je ne le fais pas POJO, mais quand je le fais POJO, le nom de la clé JSON renvoyé à API Gateway commence par une lettre inférieure (version, action), et il ne s'interprète pas bien.
Étant donné que JSON n'est pas si gros, je pense que la méthode Map est plus facile à lire.
Source Code https://github.com/kazfuku/apigateway-java-lambda-authorizer
Recommended Posts