express를 통해 ALB로부터 인증 정보 얻기

컨디션


node 16.13.1
express 4.17.3

하고 싶은 일


ALB와 코그니토를 합작하여 인증 인정을 실현할 수 있는 기회가 많을 거라고 생각합니다.
ALB 인증을 통한 HTTP 접근에 관해서는express를 통해 인증된 사용자 정보를 추출하고 싶습니다.
ex.ALB 후방 API 서버에서 POST 요청을 한 사용자의 이름과 이메일을 취득하고 DB와 결합하여 등록합니다

구성 예



실현 방법


import { Request } from "express";

const getUserInfo = (req: Request): { name: string; email: string } => {
  const oidcData = req.headers["x-amzn-oidc-data"];
  if (oidcData && typeof oidcData === "string") {
    // JWT形式の文字列からpayloadを取得
    const payload = oidcData.split(".")[1];
    // payloadをdecodeしてjson形式に変換
    const decoded = JSON.parse(Buffer.from(payload, "base64").toString("utf8"));
    return { name: decoded.name || "", email: decoded.email || "" };
  } else {
    return { name: "", email: "" };
  }
};

해설


ALB는 그림의 9에 헤더 정보를 추가합니다.

사용자 정보는 x-amzn-oidc-data에 JWT로 포함됩니다.
JWT는 JSON에 대해base 64 인코딩을 했을 뿐 유효 하중 부분을 디코딩하면 사용자 정보를 간단하게 얻을 수 있다.
# デコード後のペイロード例
{
  sub: '3344-abcd',
  email_verified: 'false',
  email: '[email protected]',
  username: 'user_name',
  exp: 1651818337,
  iss: 'https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_AAAAA'
}
JWT 정보

최후


코그니토뿐만 아니라 아주르에이드 등의 IdP와 ALB가 연합하는 경우도 마찬가지로 진행될 것으로 보인다.
참고로 x-amzn-oidc-accesstoken도 JWT 형식으로 기술하고 디코딩 후 다양한 상황이 발생할 수 있습니다.
필요에 따라 적절한 사람으로부터 정보를 얻으십시오
# デコード後のx-amzn-oidc-accesstokenペイロードの例
{
  sub: '3344-abcd',
  'cognito:groups': [ 'ap-northeast-1_AAAA_pool' ],
  iss: 'https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_AAAAA',
  version: 2,
  client_id: 'clientid',
  origin_jti: 'aaaa-bb',
  token_use: 'access',
  scope: 'openid',
  auth_time: 1651813462,
  exp: 1651820813,
  iat: 1651817213,
  jti: 'aaaa-bbbbb',
  username: 'user-name'
}
또한 우리는 이 방법을 응용하여'좋은 기능'을 실현하는 컨테이너 기반의 백엔드를 만들었다.
가능하면 이쪽도 봐주세요.
https://github.com/badmintoncryer/liketion

좋은 웹페이지 즐겨찾기