1

AWSラムダとAPIゲートウェイを使用して簡単なREST APIを作成しています。 このAPIは外部サービス(スクリプト)によって使用されますが、公開アクセスできないようにAPIへのアクセスを保護したいと考えています。また、一部のサービスがAPIの一部にアクセスするのを制限し、いつでもそのアクセス許可を取り消すことができます。APIゲートウェイ経由でのAWS Lambdaへのアクセスの保護

APIの例:

  • CatsLambda - >GET /猫
  • DogsLambda - >GET /犬
  • FishLambda - >GET /魚

外部スクリプト:

  • CatsScript/猫なく/犬/猫/犬にアクセスすることができます/魚
  • MammalScriptにアクセスすることができますしかし/fish

スクリプト用のユーザーを作成し、APIにアクセスするために使用する必要があると思います。 私はCognitoを使用することを考えていましたが、この種の設定が可能かどうかはもうわかりません。

ご意見はありますか? APIゲートウェイで独自のオーソライザを作成する必要がありますか?

答えて

0

これには、カスタムオーソライザまたはAWS Cognitoユーザプールのいずれかを使用できます。

カスタムオーソライザを使用する場合は、ラムダ関数を作成して認証パーツを作成できます。あなたがより多くを読むことができますし、カスタム承認者using this linkを実装する方法

console.log('Loading function'); 

exports.handler = (event, context, callback) => { 
    var token = event.authorizationToken; 
    // Call oauth provider, crack jwt token, etc. 
    // In this example, the token is treated as the status for simplicity. 

    switch (token.toLowerCase()) { 
     case 'allow': 
      callback(null, generatePolicy('user', 'Allow', event.methodArn)); 
      break; 
     case 'deny': 
      callback(null, generatePolicy('user', 'Deny', event.methodArn)); 
      break; 
     case 'unauthorized': 
      callback("Unauthorized"); // Return a 401 Unauthorized response 
      break; 
     default: 
      callback("Error: Invalid token"); 
    } 
}; 

var generatePolicy = function(principalId, effect, resource) { 
    var authResponse = {}; 

    authResponse.principalId = principalId; 
    if (effect && resource) { 
     var policyDocument = {}; 
     policyDocument.Version = '2012-10-17'; // default version 
     policyDocument.Statement = []; 
     var statementOne = {}; 
     statementOne.Action = 'execute-api:Invoke'; // default action 
     statementOne.Effect = effect; 
     statementOne.Resource = resource; 
     policyDocument.Statement[0] = statementOne; 
     authResponse.policyDocument = policyDocument; 
    } 

    // Can optionally return a context object of your choosing. 
    authResponse.context = {}; 
    authResponse.context.stringKey = "stringval"; 
    authResponse.context.numberKey = 123; 
    authResponse.context.booleanKey = true; 
    return authResponse; 
} 

を次のようにAWSの文書からサンプルコードです。

ユーザープールを使用している場合、APIをユーザープールに統合できます。統合を行うには、this documentationで定義されている手順に従います。 は、新しいAPIを作成するか、APIゲートウェイの既存のAPIを選択し

  • API Gatewayコンソールを使用して、ユーザーのプールの承認者を作成するには、サイトから

    引用します。
  • メインナビゲーションペインで、指定されたAPIの下でAuthorizersを選択します。
  • Authorizersの下にあるCreateを選択し、Cognito User Pool Authorizerを選択します。

この承認者を設定するには:

  • Cognito地域のための地域を選択します。
  • Cognito User Poolの場合は、使用可能なユーザープールを選択します。
  • Authorizer nameフィールドには、選択したユーザープール名が自動的に入力されます。ただし、必要に応じてカスタマイズすることができます。
  • [Identity token source]フィールドは、デフォルトで[method.request.header.Authorization]に設定されます。ただし、希望する場合は をカスタマイズすることができます。既定値を使用すると、API呼び出し者の 識別トークンを含む受信要求ヘッダーの名前が になります。
  • オプションで、App Client ID regexフィールドに正規表現を入力して、ユーザープールに関連付けられたクライアントIDを検証します。
  • 「作成」を選択すると、ユーザープールとAPIの統合が完了します。
  • 認可者を作成した後は、オプションで、ユーザープールからプロビジョニングされたIDトークンを指定してテストすることができます。あなたのAPIの方法を選択します(または作成)

    • 方法でユーザーのプール承認者を有効にするには

  • メソッドリクエストを選択します。
  • Authorization Settingsで、Authorizationフィールドで編集アイコンを選択します。
  • ドロップダウンリストから利用可能なAmazon Cognito User Poolオーソライザの1つを選択します。
  • チェックマークアイコンを選択して設定を保存します。

これらの手順を他の方法で繰り返します。

[更新]アシャンの提案した方法で回答を更新します。

もう1つの方法は、APIゲートウェイでIAM認証を使用するCognitoユーザーグループを使用することです。グループにリンクされたロールに割り当てられたポリシーを使用してアクセス許可を与えることができます。

+0

もう1つの方法は、apiゲートウェイでiam認証を使用するcognitoユーザーグループを使用することです。アクセス許可は、グループにリンクされたロールに割り当てられたポリシーによって指定できます。 – Ashan

+0

@アシャンは指摘に感謝します。あなたのメソッドで答えを更新しました。 –

関連する問題