M2M認証を用いたAPIを構築する(後半)

こんにちは、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の指定ができないため、注意してください。

スコープ、M2M、リソースサーバー - Amazon Cognito
ユーザー属性へのアクセスを許可し、Amazon Cognito ユーザープールによる API アクセス用にリソースサーバーを設定します。
 

②ヘッダーにアクセストークンを付与し、APIGatewayへアクセスするリクエストを送付。

API GatewayのURLへアクセスをしますが、肝心なのがヘッダーです。

事前に取得した情報をもとに、ヘッダーを設定します。

前半のブログで、APIGatewayのオーソライザー設定時に「Authorization」をトークンのソースとして設定したので、これをヘッダーとして設定する必要があります。

例:headers={‘Authorization’: access_token}

 

挙動確認

では、実際にLambdaのテストとして動作確認をしてみますと、ログ出力のところでAPIの裏側のLambdaとして実装したステータスコード200と「Hello from Lambda!」が出力されていることがわかります。

 

まとめ

今回はAPIGatewayのM2M認証を呼び出す方法について記載いたしました。

前半の記事と合わせて、M2M認証の理解の助けになればと思います。

著者について

フロントエンドもバックエンドも両方少しずつ勉強して、フルスタックエンジニアを目指してます。
サーバレス開発の楽しさを実感中!

ANGEL Dojo 2021 ANGEL賞、ベストアーキテクチャ賞ダブル受賞
2023 Japan AWS Jr. Champions
2022〜24 Japan AWS All Certifications Engineers

齋藤友宏をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSアプリケーション開発クラウドソリューション
シェアする
タイトルとURLをコピーしました