はじめに
記事についての
こちらの記事は連載企画の第5回です! 応用的な使い方として第2回で作成した Cognito による認証を利用して lambda 関数に authorizer を作成します。
記事一覧
- セットアップ&チュートリアル
- cognito を利用した認証機能の作成
- dynamodb を利用した CRUD の作成
- serverless-offline を利用したローカル環境の作成
- 応用的な使い方(cognito を利用した authorizer の作成) <-- 現在
内容
準備 & おさらい
- Cognito の用意
resources: Resources: CognitoUserPool: Type: AWS::Cognito::UserPool Properties: UserPoolName: ${self:app}-user-pool UsernameAttributes: - email AutoVerifiedAttributes: - email CognitoUserPoolClient: Type: AWS::Cognito::UserPoolClient Properties: ClientName: ${self:app}-user-pool-client UserPoolId: Ref: CognitoUserPool ExplicitAuthFlows: - ALLOW_USER_PASSWORD_AUTH - ALLOW_REFRESH_TOKEN_AUTH
- lambda 関数の用意
handler.js
module.exports.get = async (event) => { return { statusCode: 200, body: JSON.stringify({ result: "success", }), headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Credentials": "true", }, }; };
serverless.yml
functions: get: handler: handler.get events: - httpApi: path: /get method: get
- 一度確認
serverless deploy
- aws management console上で UserPool の確認
また、ClientId
を控えておいてください
- lambda 関数の実行確認
curl [エンドポイント]/get
本編
authorizer の作成
provider
に以下を追加
provider: ... httpApi: authorizers: MyJwtAuthorizer: #1 type: jwt identitySource: $request.header.Authorization audience: - Ref: CognitoUserPoolClient #2 issuerUrl: Fn::Join: #3 - "" - - "https://cognito-idp." - "us-east-1" - ".amazonaws.com/" - Ref: CognitoUserPool
#1
: 任意の authorizer 名を指定できる
#2
: Ref <Resource名>
定義されている特定の Resource から ID を取得することができる。今回は UserPoolClientId を取得している。
#3
: Fn::Join
値を結合して利用することができる。Ref
のように参照して取得するものがあり場合 1 行で記述することができない場合に用いる
lambda 関数に authorizer を紐付け
functions
を以下を追加
functions: ... getAuth: handler: handler.get events: - httpApi: path: /getAuth method: get authorizer: name: MyJwtAuthorizer # #1で作成したauthrozier名を指定
再度デプロイをし、authorizer が動いていることを確認する
serverless deploy
curl [エンドポイント]/get #=> {"result":"success"} curl [エンドポイント]/getAuth #=> {"message":"Unauthorized"}
accessToken により関数を実行
第 2 回の cognito の作成と同様の手順で accessToken を取得し、以下のコマンドを実行
curl -H 'Authorization: [accessToken]' [エンドポイント]/getAuth #=> {"result":"success"}
以上で cognito を利用した authorizer の作成は終了です。
まとめ
authorizer の作成には結構時間がかかってしまいました。http と httpApi では作成方法が違うようで http の場合は色々と検索にかかるのに httpApi はなかなか出てきませんでした。結果、公式のドキュメントがわかりやすかったです笑。
追記
Ref や Fn については cloudformation のドキュメントの下の方に書いてあります!
参考
https://www.serverless.com/framework/docs/providers/aws/events/http-api https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html
会社の紹介
株式会社 mofmof では一緒に働いてくれるエンジニアを募集しています。 興味のある方は是非こちらのページよりお越しください! https://www.mof-mof.co.jp/ https://www.mof-mof.co.jp/recruit/