Implémenter l'autorisation API Gateway Lambda dans Java Lambda

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.

Comment utiliser Map

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

Comment utiliser 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 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.

Résumé

É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

Implémenter l'autorisation API Gateway Lambda dans Java Lambda
Créer un SlackBot avec AWS lambda et API Gateway en Java
API Zabbix en Java
Implémentation de l'authentification en deux étapes en Java
API Java Stream en 5 minutes
Implémenter l'authentification de base en Java
Implémenter une combinaison de mathématiques en Java
2 Implémentez une analyse syntaxique simple en Java
Implémenter l'envoi d'e-mails en Java
Implémenter un tri rapide de type fonction en Java
Implémentez rm -rf en Java.
Implémenter la signature XML en Java
Implémentez Thread en Java et essayez d'utiliser la classe anonyme Lambda
Implémenter un test piloté par table dans Java 14
3 Implémentez un interpréteur simple en Java
Implémenter reCAPTCHA v3 dans Java / Spring
Implémenter la fonction PHP implode en Java
Générer l'URL de l'API CloudStack en Java
Implémenter l'API REST avec Spring Boot
Hit l'API de Zaim (OAuth 1.0) en Java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Essayez d'implémenter Yuma en Java
1 Implémentez une analyse de phrase simple en Java
JPA (API de persistance Java) dans Eclipse
Comment implémenter un travail qui utilise l'API Java dans JobScheduler
J'ai essayé d'utiliser l'API Elasticsearch en Java
Comment implémenter le calcul de la date en Java
Étude de Java 8 (API de date dans le package java.time)
Essayez d'implémenter l'ajout n-aire en Java
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java
De nos jours, les expressions Java Lambda et l'API de flux
Essayez d'utiliser l'API au format JSON en Java
Comment appliquer les conventions de codage en Java
Implémenter quelque chose comme une pile en Java
Gérez d'énormes JSON avec Java Lambda
Interagir avec l'API de message LINE à l'aide de Lambda (Java)
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Partition en Java
[Java] Création d'API à l'aide de Jerjey (Jax-rs) avec eclipse
Changements dans Java 11
Janken à Java
Essayez d'utiliser l'API Cloud Vision de GCP en Java
API Java Stream
Comment utiliser l'API Java avec des expressions lambda
Bonjour Java Lambda
[Java] Expression Lambda
Comment implémenter le verrouillage optimiste dans l'API REST
Taux circonférentiel à Java
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Expression lambda Java
FizzBuzz en Java
Essayé l'API Toot et Streaming de Mastodon en Java
J'ai essayé d'implémenter la notification push Firebase en Java
Appelez l'API Amazon Product Advertising 5.0 (PA-API v5) en Java
Utiliser des expressions Java lambda en dehors de l'API Stream