IAP 요청 헤더에서 받은 이메일을 사용하여 자세한 권한 관리

12129 단어 GCPCloudRunGAEIAPtech
Google Cloud로 화면 관리 (웹 사이트 관리) 를 시작할 때 Cloud IAP (Identity-Aware Proxy) 는 매우 편리합니다.
예를 들어 IAP 모바일 클라우드 런이 디자인한 관리 사이트를 통해'특정 Google 계정만 액세스 가능'을 간단하게 구현할 수 있다.
이 글은 IAP 도입 이후 보다 세부적인 권한 관리를 하는 방법에 관해 필기한 것이다.IAP에 대한 자세한 내용은 문서를 확인하십시오.
https://cloud.google.com/iap/docs/concepts-overview

IAP 모바일 애플리케이션을 통한 보다 세밀한 권한 관리 필요


Cloud Run과 App Engine을 사용하면 IAP가 의도하지 않아 옆길로 나간다는 전제로 쓴다.
IAP에서 실행되는 애플리케이션을 통해 보다 세밀한 권한 관리가 가능할 것으로 생각됩니다.예컨대 아래의 예.
  • 개인 정보에 접근할 수 있는 사람은 관리자 중 일부에 한함
  • 편집, 삭제 등의 조작을 희망하는 관리자 중 일부로 한정
  • 요청 헤더에서 꺼낸 메일 주소를 사용할 수 있습니다


    IAP 요청을 통해 요청 헤더에서 메시지 주소를 신뢰할 수 있는 형식으로 꺼낼 수 있습니다.구체적으로 말하면 서명 헤더"X-Goog-IAP-JWT-Assertion"에서 얻은 유효 하중에는 값email이 포함되어 있다.
    이 점문서에도 기재되어 있으니 참고만 하십시오.js+TypeScript를 사용한 샘플을 미리 업로드합니다.
    # 事前に必要なパッケージをインストール
    $ npm i google-auth-library gcp-metadata
    
    gcp-metadata는 실행 중인 Google Cloud 프로젝트의 메타데이터를 가져오는 데 사용됩니다.
    example.ts
    import { OAuth2Client } from 'google-auth-library';
    import * as metadata from 'gcp-metadata';
    
    // リクエストのたびにプロジェクトの情報を取得するのはコストが高いためキャッシュする
    // https://cloud.google.com/nodejs/getting-started/authenticate-users
    let aud: string;
    
    async function getAudience() {
      if (aud) return aud;
      if (!await metadata.isAvailable()) {
        throw new Error("プロジェクトのメタデータが取得できませんでした")
      }
    
      const projectNumber = await metadata.project('numeric-project-id');
      const projectId = await metadata.project('project-id');
    
      aud = `/projects/${projectNumber}/apps/${projectId}`;
      return aud;
    }
    
    
    
    async function getIapUserEmail(iapJwt: string): null | string {
      const aud = await getAudience();
      const { pubkeys } = await oAuth2Client.getIapPublicKeys();
    
      const ticket = await oAuth2Client.verifySignedJwtWithCertsAsync(
        iapJwt,
        pubkeys,
        aud,
        ['https://cloud.google.com/iap']
      );
    
      const payload = ticket.getPayload();
      if (!payload) return null;
    
      return payload.email
    }
    
    요청한 사용자의 메일 주소를 다음과 같은 느낌으로 얻을 수 있습니다.
    const iapJwt = req.header('X-Goog-IAP-JWT-Assertion');
    const userEmail = await getIapUserEmail(iapJwt)
    

    메일 주소에 따른 권한 관리


    그리고 데이터베이스 등에서 메일 주소에 대응하는 권한 일람표를 가지고 응용 프로그램에서 검사하면 된다.방문이 몇 사람에게만 한정된다면 JSON으로 권한 일람표를 작성할 수도 있다(Giit로 권한을 관리할 수 있는 장점도 있다).
    여기에 JSON을 사용한 간단한 샘플 코드를 미리 실었다.
    // ユーザーの権限一覧
    const userRoles = [
      {
        email: "[email protected]",
        role: "admin"
      },
      {
        email: "[email protected]",
        role: "member"
      },
      ...
    ]
    
    const iapJwt = req.header('X-Goog-IAP-JWT-Assertion');
    const userEmail = await getIapUserEmail(iapJwt)
    // リクエストユーザーの権限
    const useRole = userRoles.find(({ email }) => email === userEmail).role
    
    취득한 권한에 따라 분배 처리하면 된다.
    if (useRole !== "admin") {
      return res.status(403).json({ message: "この操作は許可されていません" })
    }
    
    더 좋은 방법을 아시는 분들은 댓글로 꼭 알려주세요.👏

    좋은 웹페이지 즐겨찾기