こんにちは、SCSK齋藤です。
前回に引き続き、Amazon API Gateway の認証方式である、Amazon Cognito を用いたM2M認証の方法について解説いたします。
まだ未読の方は下記の前半のブログを一読してください。
今回は、プログラム側でAPIを呼び出す後半のブログとなります。
おさらい
前回のブログの概要として記載したアーキテクチャ図と処理の流れを再掲します。すでに理解している人は読み飛ばしてください。
M2M認証の処理の流れは下記の通りとなります。
①APIの呼び出し元がCognitoにアクセストークンを発行しに行く。
②受け取ったアクセストークンを、ヘッダーに付与してAPIGatewayへアクセスしに行く。
③リクエストを受けたAPIGatewayは、リクエストに付加されたアクセストークンを検証するため、Cognitoに問い合わせをする。
④アクセストークン検証の結果、問題なければ後続の処理を進める。(Lambdaの呼び出し。)
API呼び出し方法について
今回は、APIを呼び出すためのLambdaを作成し、そのLambda上でM2Mの認証とAPIの呼び出しを行いたいと思います。
ソースコードは下記のようなイメージです。
import requests
def lambda_handler(event, context):
#①Cognitoのアクセストークンを取得。
response = requests.post(
'https://ap-northeast-1yfo6hsrgq.auth.ap-northeast-1.amazoncognito.com/oauth2/token',
data="grant_type=client_credentials&client_id=141ko0tsl9qpba05m4p19179m2&client_secret=76s7lr40s7jf96egk05i5snunn9v2l45icscj4hpj6a4ucf5abc&scope=default-m2m-resource-server-3dapgs/read",
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
cognito_response=response.json()
access_token=cognito_response["access_token"]
#②ヘッダーにアクセストークンを付与し、APIGatewayへアクセスするリクエストを送付。
api_response = requests.get(
'https://pqopqj9g2b.execute-api.ap-northeast-1.amazonaws.com/dev/',
headers={'Authorization': access_token}
)
api_response_json=api_response.json()
print(f'api_response is {api_response_json}')
ソースコードの中にコメントアウトしておりますが、流れを解説すると2点に分けられます。
①Cognitoのアクセストークンを取得。
Cognitoへアクセストークンを取得するためのURL、送付するデータ形式、ヘッダーが下記の通り決まっております。そのため、その通りにPostリクエストを送付するだけです。
-
- URL:’https://{Cognitoのドメイン名}.auth.{リージョン名}.amazoncognito.com/oauth2/token’
- 送付するデータ形式:”grant_type=client_credentials&client_id={CognitoユーザープールクライアントID}&client_secret={Cognitoユーザープールクライアンドシークレット}&scope={Cognitoリソースサーバー識別子}/{Cognitoリソースサーバーカスタムスコープ}”
- ヘッダー:{‘Content-Type’: ‘application/x-www-form-urlencoded’}
特にヘッダーは、下記ドキュメントに記載の通り、他のContent-Typeの指定ができないため、注意してください。
②ヘッダーにアクセストークンを付与し、APIGatewayへアクセスするリクエストを送付。
API GatewayのURLへアクセスをしますが、肝心なのがヘッダーです。
事前に取得した情報をもとに、ヘッダーを設定します。
前半のブログで、APIGatewayのオーソライザー設定時に「Authorization」をトークンのソースとして設定したので、これをヘッダーとして設定する必要があります。
例:headers={‘Authorization’: access_token}
挙動確認
では、実際にLambdaのテストとして動作確認をしてみますと、ログ出力のところでAPIの裏側のLambdaとして実装したステータスコード200と「Hello from Lambda!」が出力されていることがわかります。
まとめ
今回はAPIGatewayのM2M認証を呼び出す方法について記載いたしました。
前半の記事と合わせて、M2M認証の理解の助けになればと思います。



