LoginSignup
2
0

More than 3 years have passed since last update.

【AWS】API GatewayのCustomAuthorizerを設定する

Last updated at Posted at 2020-06-01

概要

  • LambdaなどをAPI Gateway経由で公開することはよくあると思います
  • ですが公開したエンドポイントが誰でも叩けると困るケースもあります
  • そんな時にAPI GatewayのCustom Authorizerを使うと簡単に認証機能を付与できます
  • 今回はServerlessFrameworkを使った手順を紹介します

手順

雛形生成

  • ServerlessFrameworkで雛形を作るところからいきます
mkdir custom-auth-sample
cd custom-auth-sample
sls create -t aws-nodejs-typescript
npm i
  • 一式作成できました
tree -I node_modules
.
├── handler.ts
├── package-lock.json
├── package.json
├── serverless.yml
├── tsconfig.json
├── vscode
│   └── launch.json
└── webpack.config.js

Hello関数の動作確認

  • デフォルトでHello関数があるのでそれを確認しておきます
    • Hello関数を認証突破しないと叩けないようにする流れで進めていきます
  • handler.tsではhello関数はmessageなどをreturnするだけの処理として定義してあります
handler.ts
// handler.ts抜粋
export const hello: APIGatewayProxyHandler = async (event, _context) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!',
      input: event,
    }, null, 2),
  };
}
  • serverless.ymlでhello関数にはGET:/helloでアクセスできるように定義してあります
serverless.yml
# serverless.yml抜粋

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          method: get
          path: hello
  • デプロイしましょう
sls deploy

スクリーンショット 2020-06-02 1.31.20.png

  • ログに出てくるURLにアクセスするmessageが返ってきます

スクリーンショット 2020-06-02 1.32.23.png

Auth関数の作成

  • ユーザから送信されたトークンが正しいかどうかチェックする関数を作成します
  • handler.tsの一番下に以下の内容を追記してください
    • headerのAuthorizationにセットされた値と、事前に定義しておいたキーが一致してるかチェックしています
    • 一致した場合は後続の処理を実行する権限が付与され実行されます
handler.ts
// 省略

export const auth: CustomAuthorizerHandler = (event, context) => {
  const { authorizationToken } = event;
  if (authorizationToken === process.env.AUTH_KEY) {
    const policy = {
      principalId: 'user',
      policyDocument: {
        Version: '2012-10-17',
        Statement: [
          {
            Action: 'execute-api:Invoke',
            Effect: 'Allow',
            Resource: event.methodArn,
          },
        ],
      },
    };
    context.succeed(policy);
  } else {
    context.fail('Unauthorized');
  }
};
  • serverless.ymlにCustomAuthorizerとして登録する設定をします
    • 全量載せていませんがコメントで書いている部分を追記しているだけです
    • AUTH_KEYを直接埋め込むのが嫌なケースはdotenvなど使うといいでしょう
serverless.yml
# 省略
provider:
  # 省略
  environment:
    AWS_NODEJS_CONNECTION_REUSE_ENABLED: 1
    AUTH_KEY: password@12345 # キーを環境変数として設定

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          method: get
          path: hello
          authorizer: authorizerFunc # CustomAuthorizerが適用されるように設定
  # 追加したLambda関数を登録
  authorizerFunc:
    handler: handler.auth
  • デプロイしましょう
sls deploy
  • デプロイできたら再びHello関数にアクセスしてみましょう

スクリーンショット 2020-06-02 1.42.53.png

  • 設定が適用されていれば401で弾かれているはずです
  • headerのAuthorizationにキーを設定して再度アクセスしてみます

スクリーンショット 2020-06-02 1.44.14.png

  • キーが正しいのでちゃんとアクセスできました!簡単ですね!

まとめ

  • 簡単なCustomAuthorizerの設定はServerlessFrameworkを使うと簡単に実現することができました!
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0