샘플로 보고된 문제를 수정하는 Pull Request를 검토해야 했고, 테스트가 통과되는 동안 샘플에 변경이 필요한 뭔가가 더 있을 것 같은 느낌이 들었습니다.
저는 한동안 JSON 웹 토큰(JWT는 "jots"로 발음)에 대해 알고 있었지만 알지는 못합니다. 이 PR을 보고 더 자세히 알아보고 싶은 이유가 생겼습니다.
JWT는 당사자 간에 정보를 안전하게 전송하기 위한 개방형 표준 방법입니다. 이는 사용자를 인증하고 리소스에 대한 액세스 권한을 부여하는 데 자주 사용됩니다. 헤더, 페이로드, 서명의 3가지 부분으로 구성됩니다.
IAM 서비스 계정 자격 증명 API는 IAM 서비스 계정을 가장하기 위한 단기 자격 증명을 생성합니다. signJwt 메서드는 서비스 계정의 시스템 관리 비공개 키를 사용하여 JWT에 서명합니다. signJwt 메서드의 요청 본문 내에서 페이로드 필드에는 JWT 클레임 세트가 포함된 직렬화된 JSON 개체가 포함되어야 합니다.
클레임은 JWT가 전송하는 핵심 정보입니다.
다음은 유효한 소유권 주장 집합의 예입니다.
{ "iss": "https://cloud.google.com/iam", "sub": "projects/-/serviceAccounts/[email protected]", "aud": "https://my-iap-protected-app.example.com", "iat": 1694003600, "exp": 1694007200 }
이 소유권 주장 집합에는 다음 필드가 포함됩니다.
JWT의 페이로드에 이러한 클레임을 포함하면 해당 클레임이 유효하고 IAP로 보호되는 리소스에 액세스하는 데 사용될 수 있음을 확인할 수 있습니다.
원래 코드는 다음과 같습니다.
iat = datetime.datetime.now(tz=datetime.timezone.utc) exp = iat 3600 return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": iat, "exp": exp, } )
테스트에 문제가 있다는 것을 알고 있지만 이 코드의 근본적인 문제가 해결되는 것을 막고 싶지 않습니다.
PR 작성자가 변경사항을 제출했습니다.
iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
이건 불완전한 수정이 될 것 같았습니다. API에 대한 문서를 기반으로 제출된 수정 사항이 여전히 iat를 int 유형으로 설정하지 않고 계속 실패한다는 것을 깨달았습니다. 나는 PR의
문제를 해결할 수 있는 약간의 변경을 제안했습니다.
now_utc = datetime.datetime.now(tz=datetime.timezone.utc) iat = int(now_utc.timestamp())
생각할수록 날짜/시간이 이 샘플에 유용하지 않다는 것을 깨달았습니다. Datetime 모듈은 날짜를 원할 때 유용한 날짜와 시간을 조작하기 위한 클래스를 제공합니다. 문자 그대로 UTC의 정수가 필요하므로 Time 모듈이 더 유용합니다.
인세타드, 우리는 이것을 할 수 있다
now = int(time.time()) return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": now, "exp": now 3600, } )
여기에서 이 샘플의 전체(업데이트된!) 코드를 찾으세요.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3