4
votes

AWS APIGateway CloudFormation spécifie la clé Api requise pour la méthode?

J'ai le modèle CloudFormation ci-dessous qui crée ma passerelle API (soutenue par Lambda). Je souhaite activer les clés API comme condition requise pour une ou plusieurs de ces méthodes. J'ai réussi à créer des clés API, des plans d'utilisation et l'association entre les deux, mais je ne peux pas comprendre comment activer réellement la propriété `` nécessite une clé API '' pour certaines des méthodes. La documentation d'AWS spécifie une propriété ' ApiKeyRequired ' dans le cadre du composant AWS :: ApiGateway :: Method , mais mon modèle CF n'a pas ou n'utilise pas ce composant ? Je ne sais pas comment l'utiliser étant donné que je n'en ai jamais eu besoin auparavant?

Mon modèle est ci-dessous:

   "ServerlessRestApi": {
        "Type": "AWS::ApiGateway::RestApi",
        "Properties": {
            "Description":"This is a placeholder for the description of this web api",
            "ApiKeySourceType":"HEADER",
            "Body": {
                "info": {
                    "version": "1.0",
                    "title": {
                        "Ref": "AWS::StackName"
                    }
                },
                "paths": {
                    "/list/tables": {
                        "get": {
                            "x-amazon-apigateway-integration": {
                                "httpMethod": "POST",
                                "type": "aws_proxy",
                                "uri": {
                                    "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetTableList.Arn}/invocations"
                                }
                            },
                            "security": [
                                {
                                   "api_key": []
                                }
                             ],
                            "responses": {}
                        }
                    },
                    "/list/columns/{tableid}": {
                        "get": {
                            "x-amazon-apigateway-integration": {
                                "httpMethod": "POST",
                                "type": "aws_proxy",
                                "uri": {
                                    "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetColumnList.Arn}/invocations"
                                }
                            },
                            "responses": {}
                        }
                    },
                    "datagw/general/table/get/{tableid}": {
                        "get": {
                            "x-amazon-apigateway-integration": {
                                "httpMethod": "POST",
                                "type": "aws_proxy",
                                "uri": {
                                    "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetTableResponse.Arn}/invocations"
                                }
                            },
                            "responses": {}
                        }
                    },
                    "/": {
                        "get": {
                            "x-amazon-apigateway-integration": {
                                "httpMethod": "POST",
                                "type": "aws_proxy",
                                "uri": {
                                    "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Get.Arn}/invocations"
                                }
                            },
                            "responses": {}
                        }
                    },
                    "/tables/{tableid}/{columnid}": {
                        "get": {
                            "x-amazon-apigateway-integration": {
                                "httpMethod": "POST",
                                "type": "aws_proxy",
                                "uri": {
                                    "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetTableBasic.Arn}/invocations"
                                }
                            },
                            "responses": {}
                        }
                    },
                    "securityDefinitions": {
                        "type": "api_key",
                        "name": "x-api-key",
                        "in": "header"
                      }
                },
                "swagger": "2.0"
            }
        }
    },


0 commentaires

5 Réponses :


2
votes

Je pense que l'ajout de security sous chaque chemin, puis de securityDefinitions sous chemins fonctionnerait.

"paths": {
  "/list/tables": {
     "get": {
        "x-amazon-apigateway-integration": {
           "httpMethod": "POST",
           "type": "aws_proxy",
           "uri": {
              "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015- 
               03-31/functions/${GetTableList.Arn}/invocations"
           }
        },
        "security": [
           {
              "api_key": []
           }
        ]
     }
  }
},
"securityDefinitions": {
  "type": "api_key",
  "name": "x-api-key",
  "in": "header"
}

p >


6 commentaires

Merci Athar - Dois-je spécifier un identifiant de clé dans la valeur security> api_key? (Vous l'avez montré comme des crochets vides dans votre exemple)


C'est la syntaxe pour définir les étendues de sécurité dans Swagger. Il ne devrait donc s'agir que d'un tableau vide. Consultez l'étape 2 Application de la sécurité dans swagger.io/docs/specification/authentication


merci, je vais vérifier aujourd'hui et si cela se passe, je marquerai la question comme réponse. Merci Athar, j'apprécie vraiment votre temps là-dessus.


malheureusement, cela ne semble pas fonctionner. La méthode est liée à un plan d'utilisation, mais elle indique que la méthode ne nécessite pas de clé API. Je mettrai à jour mon message avec mon nouveau modèle.


J'ai essayé cette solution et j'ai constaté qu'elle ne forçait pas la méthode à exiger une clé API. Bien que le document Swagger indique que la sécurité requise a été définie, il n'influence pas le paramètre lors du déploiement via Cloud Formation.


Il a créé la clé API mais ne l'applique pas. Sous la demande de méthode, il est indiqué Clé API requise false



1
votes

J'ai rencontré le même problème et je l'ai résolu en abandonnant l'utilisation de la propriété Body dans AWS :: ApiGateway :: RestApi en utilisant:

"CoreApiPostMethod":
  {
    "Type": "AWS::ApiGateway::Method",
     "DependsOn" : ["AspNetCoreFunction", "ServerlessRestApi"],
    "Properties":
    {
     "AuthorizationType" :"NONE",
      "OperationName" : "My API Post Request",

     "ApiKeyRequired" : true,
            "ResourceId": { "Ref": "ProxyResource"  },
    "RestApiId": {
      "Ref": "ServerlessRestApi"
    },
     "HttpMethod" : "POST",
      "Integration" : {  
       "ConnectionType" :  "INTERNET",
          "IntegrationHttpMethod" : "POST",
       "Type" : "AWS_PROXY",
        "Uri" : {
                          "Fn::Sub":"arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${AspNetCoreFunction.Arn}/invocations"
                }
      }        
    }

  },

Ensuite, j'ai créé une ressource proxy. Dans votre cas, vous créeriez une ressource pour chacun de vos chemins. Là où j'ai, "{proxy +}", vous auriez "/ list / tables".

"ProxyResource": {
    "Type": "AWS::ApiGateway::Resource",
    "Properties": {
        "RestApiId": {
            "Ref": "ServerlessRestApi"
        },
        "ParentId": {
            "Fn::GetAtt": [
                "ServerlessRestApi",
                "RootResourceId"
            ]
        },
        "PathPart": "{proxy+}"
    }
},

Enfin, j'ai pu définir une méthode AWS :: ApiGateway :: puis appliquer l'utilisation d'une clé API:

 "ServerlessRestApi": {
        "Type": "AWS::ApiGateway::RestApi",
        "DependsOn": "AspNetCoreFunction",
        "Properties": {
           "Description":"My Api Gateway",
            "ApiKeySourceType" : "HEADER",      
            "EndpointConfiguration" : {  "Types" : [ "REGIONAL" ]}
        }
    },

Et puis suivez le même modèle pour les autres méthodes HTTP. C'est plus détaillé que la configuration d'origine, mais cela vous donne plus de contrôle sur la configuration de la méthode.


1 commentaires

Je vais essayer, cela ressemble le plus à la solution qui me conviendrait (même si ça va être incroyablement verbeux pour tous les chemins que j'ai: P)



1
votes

En retard à la fête.

              "Body": {
                    "swagger": "2.0",
                    "info": {
                        "version": "2017-01-27T21:44:58Z",
                        "title": {"Ref": "AWS::StackName"}
                    },
                    "basePath": "/bbd",
                    "x-amazon-apigateway-api-key-source" : "HEADER",
                    "schemes": [
                        "https"
                    ],
                    "paths": {
                        "/{proxy+}": {
                            "x-amazon-apigateway-any-method": {
                                "produces": [
                                    "application/json"
                                ],
                                "parameters": [
                                    {
                                        "name": "proxy",
                                        "in": "path",
                                        "required": true,
                                        "type": "string"
                                    }
                                ],
                                "security" : [{
                                    "bbd" : []
                                }],
                                "responses": {},
                                "x-amazon-apigateway-integration": {
                                    "responses": {
                                        "default": {
                                            "statusCode": "200"
                                        }
                                    },
                                    "uri": "<URL>",
                                    "passthroughBehavior": "when_no_match",
                                    "httpMethod": "POST",
                                    "cacheNamespace": "xh7gp9",
                                    "cacheKeyParameters": [
                                        "method.request.path.proxy"
                                    ],
                                    "contentHandling": "CONVERT_TO_TEXT",
                                    "type": "aws_proxy"
                                }
                            }
                        }
                    },
                    "securityDefinitions": {
                        "bbd": {
                            "type": "apiKey",
                            "name": "x-api-key",
                            "in": "header"
                        }
                    }
                }

Et

"security" : [{
    "<SOME_NAME>" : []
}]

Et

"securityDefinitions": {
    "<SOME_NAME>": {
        "type": "apiKey",
        "name": "x-api-key",
        "in": "header"
    }
 }

Une solution de travail possible pourrait donc être

"x-amazon-apigateway-api-key-source" : "HEADER",


0 commentaires

0
votes
"security" : [{
                "myKey" : []
            }],

"myKey": {
            "type": "apiKey",
            "name": "x-api-key",
            "in": "header"
        },
Adding security element in body and myKey element in securityDefinitions worked for me.

0 commentaires

0
votes

Guide complet ici . Ce guide fournit une configuration de base pour activer les clés API pour toutes les méthodes API Gateway.

Utilisez AWS :: Serverless :: Api pour définir votre API. Il prend en charge une Auth un attribut> qui a un attribut nommé ApiKeyRequired. Définissez ceci sur true.

L'extrait de code suivant du guide ci-dessus devrait faire l'affaire.

AuthApiGateway:
    Type: AWS::Serverless::Api
    Properties:
       StageName: Prod
       Auth:
           ApiKeyRequired: 'true' # This makes passing ApiKey mandatory
       DefinitionBody:
           swagger: '2.0'
           info: ...


0 commentaires