Rumah >pembangunan bahagian belakang >Tutorial Python >Membina Set Tuntutan JWT yang sah

Membina Set Tuntutan JWT yang sah

Patricia Arquette
Patricia Arquetteasal
2024-09-29 11:35:301042semak imbas

Building a valid JWT Claims Set

Pengenalan

Saya perlu menyemak Permintaan Tarik yang membetulkan isu yang dilaporkan dengan sampel dan semasa ujian sedang berlalu, rasanya mesti ada sesuatu yang lebih berlaku dengan sampel yang perlu diubah.

Saya telah mengetahui tentang Token Web JSON (JWT disebut "jots") untuk sementara waktu, saya tidak mengetahui mereka. Melihat PR ini memberi saya alasan untuk menggali lebih lanjut.

Apakah itu JWT

JWT ialah kaedah standard terbuka untuk menghantar maklumat dengan selamat antara pihak. Mereka sering digunakan untuk mengesahkan pengguna dan membenarkan akses kepada sumber. Ia terdiri daripada 3 bahagian, satu tajuk, muatan dan tandatangan.

Mengapa anda memerlukan JWT

API Kredensial Akaun Perkhidmatan IAM mencipta bukti kelayakan jangka pendek untuk menyamar sebagai akaun perkhidmatan IAM. SignJwtmethod akan menandatangani JWT menggunakan kunci peribadi terurus sistem akaun perkhidmatan. Dalam badan permintaan kaedah signJwt, medan muatan harus mengandungi objek JSON bersiri yang mengandungi set tuntutan JWT.

Apakah Tuntutan JWT

Tuntutan ialah maklumat teras yang dihantar oleh JWT.

Berikut ialah contoh set tuntutan yang sah:

{
  "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
}

Set tuntutan ini termasuk medan berikut:

  • iss: Pengeluar JWT, akaun perkhidmatan yang akan mengesahkan, dalam kes ini hendaklah e-mel akaun perkhidmatan.
  • sub: Subjek pengguna JWT, iaitu e-mel akaun perkhidmatan.
  • aud: Khalayak JWT, yang merupakan URL sumber yang dilindungi IAP.
  • iat: Masa yang dikeluarkan, iaitu masa di mana JWT dijana. Ini mestilah integer dalam UTC.
  • exp: Masa tamat tempoh, iaitu masa di mana JWT tidak lagi sah. Terdapat had tambahan yang didokumenkan Cloud IAM: bahawa ia tidak boleh berlaku pada masa lalu dan tidak melebihi 12 jam pada masa hadapan.

Dengan memasukkan tuntutan ini dalam muatan JWT anda, anda boleh memastikan ia sah dan boleh digunakan untuk mengakses sumber yang dilindungi IAP.

Jadi tentang PR itu

Kod asal kelihatan seperti

    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,
        }
    )

Saya tahu ada sesuatu yang sedang berlaku dengan ujian tetapi saya tidak mahu menyekat mendapatkan isu asas dengan kod ini diselesaikan.

Pengarang PR menyerahkan perubahan

iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()

Ini nampaknya seperti pembetulan yang tidak lengkap. Berdasarkan dokumentasi untuk API, saya menyedari bahawa pembetulan yang diserahkan masih tidak akan menetapkan iat untuk menaip int dan masih akan gagal. Saya mencadangkan sedikit perubahan yang akan menyelesaikan isu PR tentang

now_utc = datetime.datetime.now(tz=datetime.timezone.utc)  
iat = int(now_utc.timestamp())

Semakin lama saya memikirkannya, saya menyedari bahawa Datetime tidak berguna untuk sampel ini. Modul Datetime membekalkan kelas untuk memanipulasi tarikh dan masa yang berguna apabila anda mahu tarikh. Kami benar-benar memerlukan integer dalam UTC supaya modul Masa lebih berguna.

Insetad, kita boleh lakukan ini

  now = int(time.time())

    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": now,
            "exp": now + 3600,
        }
    )

Cari kod lengkap (dikemas kini!) untuk sampel ini di sini.

Atas ialah kandungan terperinci Membina Set Tuntutan JWT yang sah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn