Cognito User PoolのJWTトークンを検証する

Cognito User Poolへログインした際に返却されるAccessTokenやIdTokenを検証する方法。
API Gatewayの認証でCognitoを使いたいけど、いろいろ処理を入れたいときなどに。

const request = require('request-promise-native')
const jwt = require('jsonwebtoken')
const generatePEM = require('rsa-pem-from-mod-exp')

const verifyToken = async token => {
  const { header, payload } = jwt.decode(token, { complete: true })

  if (!payload) {
    throw new Error('invalid token')
  }

  if (payload.iss !== YOUR_COGNITO_IDP_ISSUER) {
    throw new Error('invalid token')
  }

  const jwks = await request({
    method: 'GET',
    uri: `${payload.iss}/.well-known/jwks.json`,
    transform: body => JSON.parse(body)
  })

  const { n, e } = jwks.keys.find(c => (c.kid === header.kid))
  const pem = generatePEM(n, e)

  return new Promise((resolve, reject) => {
    jwt.verify(token, pem, (error, decoded) => {
      if (error) {
        reject(error)
        return
      }
      resolve(decoded)
    })
  })
}

流れとしては、

  1. 自分のCognitoのトークンか検証
  2. キーを取得してPEMを生成
  3. 生成したPEMを用いてトークンを検証

必要であれば、token_useの確認を。