API Gatewayのオーソライザーの機能を確認してみる

API Gatewayのオーソライザーの機能を確認してみる

API Gatewayのオーソライザー機能を利用すると、認可をすることができるようになります。

「トークン」タイプと「リクエスト」タイプがあるようです。

トークンタイプ

トークンタイプの設定をしてみたいと思います。

LambdaオーソライザーというLambda関数を作成する必要があります。この関数が認可機能の役割をしてくれます。

Lambdaオーソライザー

ここではauthという名前のLambda関数を作成します。コードは以下です。

exports.handler = function(event, context, callback) {
  var token = event.authorizationToken;
  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");
  }
};

// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
  var authResponse = {};

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

  // Optional output with custom properties of the String, Number or Boolean type.
  authResponse.context = {
    "stringKey": "stringval",
    "numberKey": 123,
    "booleanKey": true
  };
  return authResponse;
}

TOKENタイプの値は、event.authorizationTokenにトークンが入っています。

eventの中身

{
  type: 'TOKEN',
  methodArn: 'arn:aws:execute-api:ap-northeast-1:123456789012:1b44jot3cd/XXXXInvoke-stage/GET/',
  authorizationToken: 'x'
}

トークンの種類と意味です。

種類 意味
allow 許可
deny 拒否
unauthorized 不正
fail 失敗

トークンのソースには「method.request.header.Authorization」を指定します。

※トークンのソースはヘッダーのkeyと一致していればOKです

API Gatewayのオーソライザーの機能を確認してみる

「作成」をクリックすると、API GatewayにLambda関数を呼び出す権限を追加するよう促されます。「Grant & Create」を押します。

API Gatewayのオーソライザーの機能を確認してみる

認可設定する

作成したLambda Auth functionをメソッドに対して設定します。

API Gatewayのオーソライザーの機能を確認してみる

「メソッドリクエスト」をクリックします。

「認証」で先ほど作成したカスタムオーソライザーが表示されますので、それを設定します。

API Gatewayのオーソライザーの機能を確認してみる

テスト

保存すると、「テスト」というリンクが表示されるのでテストすることができます。

ヘッダーに「allow」を指定して、「テスト」を押します。

API Gatewayのオーソライザーの機能を確認してみる

これで、生成したポリシーを確認することができます。

参考サイト

aws-api-gateway-clientの使い方

aws-api-gateway-clientモジュールを使えばローカルからapigatewayが叩けます。

npm init -y
npm install --save aws-api-gateway-client

クライアント側のindex.jsは以下です。

const apigClientFactory = require('aws-api-gateway-client').default;

const apigClient = apigClientFactory.newClient({
  invokeUrl:'https://xxxxxxxxxx.execute-api.ap-southeast-2.amazonaws.com',
  accessKey: 'YYEFE2UEI3N1IUYHZGN',
  secretKey: 'EEhrWCrUeCCxKggYUpUFTEn7Oa4d+oxQWE7WC8UT',
  sessionToken: 'SESSION_TOKEN',
  region: 'ap-northeast-1',
  apiKey: '12345678901234567890' // APIキー使用している場合はここに記載する
});
const pathParams = {
};
const pathTemplate = '/dev/edge'
const method = 'GET';
const additionalParams = {
  headers: {
    Authentication:'xx'
  },
  queryParams: {
  }
};
const body = {
};

apigClient.invokeApi(pathParams, pathTemplate, method, additionalParams, body)
  .then(function(result){
    console.log(JSON.stringify(result.headers));
  }).catch( function(result){
    console.log(result);
  });

aws-api-gateway-client

リクエストタイプ

リクエストタイプにした場合にcurlで実行した際のeventの中身です。

curl -i -X PUT "Content-Type:application/json" -H "hoge:abc" https://~~

eventの中身

{
  type: 'REQUEST',
  methodArn: 'arn:aws:execute-api:ap-northeast-1:123456789012:1b44jot3cd/dev/PUT/hoge',
  resource: '/hoge',
  path: '/hoge',
  httpMethod: 'PUT',
  headers: {
    Accept: '*/*',
    'Content-Type': 'application/json',
    hoge: 'abc',
    Host: '1b44jot3cd.execute-api.ap-northeast-1.amazonaws.com',
    'User-Agent': 'curl/8.4.0',
    'X-Amzn-Trace-Id': 'Root=1-6618b52e-41f75d5234050aee7f630220',
    'X-Forwarded-For': '100.100.100.100',
    'X-Forwarded-Port': '443',
    'X-Forwarded-Proto': 'https'
  },
  multiValueHeaders: {
    Accept: [ '*/*' ],
    'Content-Type': [ 'application/json' ],
    hoge: [ 'abc' ],
    Host: [ '1b44jot3cd.execute-api.ap-northeast-1.amazonaws.com' ],
    'User-Agent': [ 'curl/8.4.0' ],
    'X-Amzn-Trace-Id': [ 'Root=1-6618b52e-41f75d5234050aee7f630220' ],
    'X-Forwarded-For': [ '100.100.100.100' ],
    'X-Forwarded-Port': [ '443' ],
    'X-Forwarded-Proto': [ 'https' ]
  },
  queryStringParameters: {},
  multiValueQueryStringParameters: {},
  pathParameters: {},
  stageVariables: {},
  requestContext: {
    resourceId: '40rd6o',
    resourcePath: '/hoge',
    httpMethod: 'PUT',
    extendedRequestId: 'WGE_TFA-NjMEnsQ=',
    requestTime: '12/Apr/2022:04:14:38 +0000',
    path: '/dev/hoge',
    accountId: '123456789012',
    protocol: 'HTTP/1.1',
    stage: 'dev',
    domainPrefix: '1b44jot3cd',
    requestTimeEpoch: 1712895278487,
    requestId: 'a6c00500-d41f-4dd3-a8f6-2f0802e19ad3',
    identity: {
      cognitoIdentityPoolId: null,
      accountId: null,
      cognitoIdentityId: null,
      caller: null,
      sourceIp: '100.100.100.100',
      principalOrgId: null,
      accessKey: null,
      cognitoAuthenticationType: null,
      cognitoAuthenticationProvider: null,
      userArn: null,
      userAgent: 'curl/8.4.0',
      user: null
    },
    domainName: '1b44jot3cd.execute-api.ap-northeast-1.amazonaws.com',
    deploymentId: 'f04tvr',
    apiId: '1b44jot3cd'
  }
}

Lambdaオーソライザーが返却する形式のJSONです。Effectに設定できる値は以下の通りです。

種類 意味
Allow 許可
Deny 拒否
Unauthorized 未認証

この値によってエンドポイントまで通過するか、それとも認可エラーにするかなどの動きになります。

{
    "principalId": "me",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "arn:aws:execute-api:ap-northeast-1:123456789012:1b44jot3cd/dev/PUT/hoge"
            }
        ]
    },
    "context": {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    }
}

contextはオプションになりますので省略可能です。設定した場合は、エンドポイントのLambdaなどに、Lambdaオーソライザーからの出力として渡されます。

取得するには、event.requestContext.authorizer.stringKeyというようにアクセスすれば取得可能です。

ドキュメント

API Gateway Lambda オーソライザーを使用する - Amazon API Gateway
Amazon API Gateway Lambda オーソライザーを有効にして API リクエストを認証します。
Amazon API Gateway Lambda オーソライザーからの出力 - Amazon API Gateway
Lambda オーソライザー関数の出力はディクショナリのようなオブジェクトです。プリンシパル ID ( principalId ) と、ポリシーステートメントのリストを含むポリシードキュメント ( policyDocument ) を含む必...

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました