いけむランド

はてダからやってきました

Amazon Cognito ユーザープールに統合された REST API を呼び出せるかを自動で確認する

API Gateway と Cognito の設定が終わって、きちんと REST API を叩けるか確認するのを自動化したいなと思って、いろいろ調べた結果をまとめます。


基本的に公式に書いてある内容に従えば良いのですが、サインインが UI 前提になってるため、自動化するのがそのままだとめんどいです。


docs.aws.amazon.com


そのため、トークンを取得するための API を使うと良さそうです。


stackoverflow.com


というわけで書いてみました。

  def token
    cip = Aws::CognitoIdentityProvider::Client.new(region: REGION)
    secret_hash = Base64.encode64(OpenSSL::HMAC.digest('sha256', CLIENT_SECRET, TEST_USERNAME + CLIENT_ID))
    response = cip.admin_initiate_auth({
                                         user_pool_id: USER_POOL_ID,
                                         client_id: CLIENT_ID,
                                         auth_flow: :ADMIN_NO_SRP_AUTH,
                                         auth_parameters: {
                                           USERNAME: TEST_USERNAME,
                                           PASSWORD: TEST_PASSWORD,
                                           SECRET_HASH: secret_hash.strip # 行末の改行があるとエラーになったため
                                         }
                                       })
    response.authentication_result.id_token
  end

  def test
    connection = Faraday.new(API_HOST) do |conn|
      conn.headers['Authorization'] = token
    end
    response = connection.get(API_STAGE + '/users') # ここは自分で用意したエンドポイントを適当に
    # pp response
    expect(response.status).to eq(200) # rspec で確認する場合はこんな感じで
  end


SecretHash の計算方法も公式にあります。(どうせなら SDK に実装を入れておいてほしい。)


docs.aws.amazon.com


これを cron とかでぶん回しておけば、設定を変更した時にミスってないかの確認が容易になるんじゃないかと思います。