보고된 문제를 샘플로 수정하는 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/my-service-account@my-project.iam.gserviceaccount.com", "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이 유용하지 않다는 것을 깨달았습니다. Datetime 모듈은 날짜를 원할 때 유용한 날짜와 시간을 조작하기 위한 클래스를 제공합니다. 문자 그대로 UTC의 정수가 필요하므로 시간 모듈이 더 유용합니다.
인세타드, 우리는 할 수 있어요
now = int(time.time()) return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": now, "exp": now + 3600, } )
여기에서 이 샘플의 전체(업데이트된!) 코드를 찾으세요.
위 내용은 유효한 JWT 클레임 세트 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!