Halaman ini berlaku untuk Apigee dan Apigee Hybrid.
Lihat dokumentasi
Apigee Edge.
Apa
Membuat JWS yang ditandatangani, dengan kumpulan klaim yang dapat dikonfigurasi. JWS kemudian dapat dikembalikan ke klien, dikirim ke target backend, atau digunakan dengan cara lain. Lihat Ringkasan kebijakan JWS dan JWT untuk pengantar mendetail.
Untuk mempelajari bagian-bagian JWS serta cara mengenkripsi dan menandatanganinya, lihat RFC7515.
Kebijakan ini adalah Kebijakan yang dapat diperluas dan penggunaan kebijakan ini mungkin memiliki implikasi biaya atau penggunaan, bergantung pada lisensi Apigee Anda. Untuk mengetahui informasi tentang jenis kebijakan dan implikasi penggunaannya, lihat Jenis kebijakan.
Video
Tonton video singkat untuk mempelajari cara membuat JWT yang ditandatangani. Meskipun video ini khusus untuk membuat JWT, banyak konsepnya yang sama dengan JWS.
Sampel
Buat JWS yang ditandatangani dengan HS256
Contoh kebijakan ini menghasilkan JWS yang ditandatangani menggunakan algoritma HS256. HS256 mengandalkan rahasia bersama untuk menandatangani dan memverifikasi tanda tangan. JWS ini menggunakan konten "terlampir", yang berarti header, payload, dan tanda tangan yang dienkode digabungkan dengan titik untuk menghasilkan JWS akhir:
[header].[payload].[signature]
Gunakan elemen <Payload> untuk menentukan payload JWS mentah yang tidak dienkode.
Dalam contoh ini, variabel berisi payload. Saat tindakan kebijakan ini dipicu,
Apigee mengenkode header dan payload JWS, lalu menambahkan tanda tangan yang dienkode untuk menandatangani JWS secara digital.
Konfigurasi kebijakan di bawah ini membuat JWS dari payload yang ada dalam variabel
my-payload, dan menyimpan JWS yang dihasilkan dalam variabel
output-variable.
<GenerateJWS name="JWS-Generate-HS256"> <DisplayName>JWS Generate HS256</DisplayName> <Algorithm>HS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> <Payload ref="my-payload"/> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Membuat JWT yang ditandatangani HS256
Contoh ini juga menghasilkan JWS dengan konten terlampir yang ditandatangani menggunakan algoritma HS256. Dalam hal ini, payload-nya adalah JSON. Menyetel header typ ke JWT
akan menghasilkan JWS yang ditandatangani yang juga merupakan JWT yang ditandatangani.
(referensi)
Konfigurasi kebijakan di bawah ini membuat JWS dari payload yang ada dalam variabel
json-content, dan menyimpan JWS yang dihasilkan dalam variabel
output-variable. Hasilnya akan berupa JWT yang ditandatangani jika dan hanya jika
variabel json-content menyimpan payload JSON, dan properti dalam
payload JSON tersebut valid untuk JWT. Misalnya, properti exp, jika ada, harus menyimpan nilai numerik. Properti aud, jika ada,
harus berupa string atau array string. Dan seterusnya. Lihat
IETF RFC7519 untuk
detail tentang nilai yang valid untuk klaim JWT.
<GenerateJWS name="JWS-Generate-HS256-JWT"> <Algorithm>HS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref="private.secretkey"/> </SecretKey> <Payload ref="json-content"/> <AdditionalHeaders> <Claim name="typ">JWT</Claim> </AdditionalHeaders> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Membuat JWS yang terpisah
Contoh kebijakan ini menghasilkan JWS dengan konten terpisah, yang ditandatangani menggunakan algoritma RS256. Pembuatan tanda tangan RS256 bergantung pada kunci pribadi RSA, yang harus diberikan dalam bentuk yang dienkode PEM.
JWS dengan konten terpisah menghilangkan payload dari JWS yang dihasilkan:
[header]..[signature]
Gunakan elemen <Payload> untuk menentukan payload JWS mentah yang tidak dienkode.
Saat kebijakan ini dipicu, Apigee mengenkode header dan payload JWS, lalu menggunakannya
untuk membuat tanda tangan yang dienkode. Namun, JWS yang dihasilkan menghilangkan payload yang dienkode dari
JWS yang diserialisasi. Hal ini berguna jika konten yang ditandatangani berukuran besar, atau biner (seperti
gambar atau PDF), atau keduanya. Agar validasi diizinkan, Anda harus meneruskan kedua elemen, JWS dan
payload yang disertakan dalam konten bertanda tangan, kepada pihak yang memverifikasi. Jika Anda menggunakan
kebijakan VerifyJWS untuk memverifikasi JWS, Anda dapat menentukan variabel yang berisi payload
dengan elemen <DetachedContent> dari kebijakan VerifyJWS.
<GenerateJWS name="JWS-Generate-RS256"> <DisplayName>JWS Generate RS256</DisplayName> <Algorithm>RS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> <Payload ref="my-payload"/> <DetachContent>true</DetachContent> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Menetapkan elemen utama
Elemen yang Anda gunakan untuk menentukan kunci yang digunakan untuk membuat JWS bergantung pada algoritma yang dipilih, seperti yang ditunjukkan dalam tabel berikut:
| Algoritme | Elemen utama | |
|---|---|---|
| HS{256/384/512}* | <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> |
|
| RS/PS/ES{256/384/512}* | <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> Elemen |
|
| *Untuk mengetahui informasi selengkapnya tentang persyaratan utama, lihat Tentang algoritma enkripsi tanda tangan. | ||
Referensi elemen untuk Generate JWS
Referensi kebijakan menjelaskan elemen dan atribut kebijakan Generate JWS.
Catatan: Konfigurasi akan sedikit berbeda, bergantung pada algoritma enkripsi yang Anda gunakan. Lihat Contoh untuk contoh yang menunjukkan konfigurasi untuk kasus penggunaan tertentu.
Atribut yang diterapkan ke elemen tingkat teratas
<GenerateJWS name="JWS" continueOnError="false" enabled="true" async="false">
Atribut berikut umum untuk semua elemen induk kebijakan.
| Atribut | Deskripsi | Default | Kehadiran |
|---|---|---|---|
| nama |
Nama internal kebijakan. Karakter yang dapat Anda gunakan dalam nama dibatasi untuk:
A-Z0-9._\-$ %. Namun, UI Apigee menerapkan batasan tambahan, seperti menghapus karakter yang bukan alfanumerik secara otomatis.
Secara opsional, gunakan elemen |
T/A | Wajib |
| continueOnError |
Disetel ke false untuk menampilkan error saat kebijakan gagal. Hal ini adalah perilaku yang diharapkan untuk sebagian besar kebijakan.
Setel ke |
false | Opsional |
| diaktifkan |
Tetapkan ke true untuk menerapkan kebijakan.
Setel ke |
true | Opsional |
| asinkron | Atribut ini tidak digunakan lagi. | false | Tidak digunakan lagi |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
Gunakan selain atribut nama untuk memberi label pada kebijakan di editor proxy UI Apigee dengan nama bahasa alami yang berbeda.
| Default | Jika Anda menghapus elemen ini, nilai atribut nama kebijakan akan digunakan. |
| Kehadiran | Opsional |
| Jenis | String |
<Algorithm>
<Algorithm>algorithm-here</Algorithm>
Menentukan algoritma enkripsi untuk menandatangani token.
| Default | T/A |
| Kehadiran | Wajib |
| Jenis | String |
| Nilai yang valid | HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512 |
<AdditionalHeaders/Claim>
<AdditionalHeaders> <Claim name='claim1'>explicit-value-of-claim-here</Claim> <Claim name='claim2' ref='variable-name-here'/> <Claim name='claim3' ref='variable-name-here' type='boolean'/> <Claim name='claim4' ref='variable-name' type='string' array='true'/> </AdditionalHeaders>
Menempatkan pasangan nama/nilai klaim tambahan di header untuk JWS.
| Default | T/A |
| Kehadiran | Opsional |
| Nilai yang valid | Nilai apa pun yang ingin Anda gunakan untuk klaim tambahan. Anda dapat menentukan klaim secara eksplisit sebagai string, angka, boolean, peta, atau array. |
Elemen <Claim> menggunakan atribut berikut:
- name - (Wajib) Nama klaim, juga dikenal sebagai parameter.
- ref - (Opsional) Nama variabel alur. Jika ada, kebijakan akan menggunakan nilai variabel ini sebagai klaim. Jika atribut ref dan nilai klaim eksplisit ditentukan, nilai eksplisit adalah nilai default, dan digunakan jika variabel alur yang dirujuk tidak terselesaikan.
- type - (Opsional) Salah satu dari: string (default), angka, boolean, atau peta
- array - (Opsional) Tetapkan ke true untuk menunjukkan apakah nilai adalah array jenis. Default: false.
<CriticalHeaders>
<CriticalHeaders>a,b,c</CriticalHeaders> or: <CriticalHeaders ref="variable_containing_headers"/>
Menambahkan header penting, crit, ke JWS. Header crit adalah array nama header yang harus diketahui dan dikenali oleh penerima JWS. Misalnya, Anda dapat menggunakan elemen konfigurasi ini untuk menghasilkan header JWS yang saat didekode, terlihat seperti ini:
{
"typ": "...",
"alg" : "...",
"hyb" : "some-value-here",
"crit" : [ "hyb" ],
}Header JWS ini menegaskan bahwa parameter header hyb sangat penting, dan setiap penerima JWS harus memahami arti dan nilai parameter tersebut.
Sesuai dengan IETF RFC 7515, penerima JWS harus menolak JWS sebagai
tidak valid jika penerima tidak memahami satu atau beberapa parameter yang dirujuk dalam
parameter crit. Di Apigee, kebijakan VerifyJWS sesuai dengan perilaku ini.
Untuk setiap parameter yang tercantum dalam parameter crit, kebijakan
<KnownHeaders> elemen VerifyJWS juga mencantumkan parameter tersebut.
Header apa pun yang ditemukan kebijakan VerifyJWS di crit yang tidak tercantum
di <KnownHeaders> menyebabkan kebijakan VerifyJWS menolak JWS.
| Default | T/A |
| Kehadiran | Opsional |
| Jenis | Array yang dipisahkan koma dari satu atau beberapa string |
| Nilai yang valid | Larik atau referensi ke variabel yang berisi larik. |
<DetachContent>
<DetachContent>true|false</DetachContent>
Menentukan apakah akan membuat JWS dengan payload terpisah, <DetachContent>true</DetachContent>,
atau tidak, <DetachContent>false</DetachContent>.
Jika Anda menentukan false, default, JWS yang dihasilkan akan berbentuk:
[header].[payload].[signature]
Jika Anda menentukan benar untuk membuat JWS dengan payload terpisah, JWS yang dihasilkan akan menghilangkan payload dan berbentuk:
[header]..[signature]
Dengan JWS yang menggunakan payload terpisah, Anda harus meneruskan payload asli yang tidak dienkode ke pihak yang memverifikasi, bersama dengan JWS yang diserialisasi.
| Default | false |
| Kehadiran | Opsional |
| Jenis | Boolean |
| Nilai yang valid | benar atau salah |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
Setel ke salah (false) jika Anda ingin kebijakan menampilkan error saat variabel yang dirujuk yang ditentukan dalam kebijakan tidak dapat diselesaikan. Setel ke benar (true) untuk memperlakukan variabel yang tidak dapat diselesaikan sebagai string kosong (null).
| Default | false |
| Kehadiran | Opsional |
| Jenis | Boolean |
| Nilai yang valid | benar atau salah |
<OutputVariable>
<OutputVariable>output-variable</OutputVariable>
Menentukan nama variabel konteks yang akan ditetapkan kebijakan dengan JWS yang dihasilkan.
Secara default, kebijakan menempatkan JWS ke dalam variabel konteks bernama
jws.POLICYNAME.generated_jws.
| Default | jws.POLICYNAME.generated_jws |
| Kehadiran | Opsional |
| Jenis | String (nama variabel alur) |
<Payload>
<Payload ref="flow-variable-name-here" /> or <Payload>payload-value</Payload>
Menentukan payload JWS mentah yang tidak dienkode. Tentukan variabel yang berisi payload, atau string.
| Default | T/A |
| Kehadiran | Wajib |
| Jenis | String, array byte, stream, atau representasi lain dari payload JWS yang tidak dienkode. |
| Nilai yang valid | Template pesan, atau referensi ke variabel yang berisi payload. |
Elemen <PrivateKey>
Opsi ini bersifat opsional, hanya untuk digunakan jika <Algorithm> adalah salah satu opsi RS*, PS*,
atau ES*. Objek ini menentukan kunci pribadi yang akan digunakan untuk penandatanganan, serta informasi lain
yang terkait dengan kunci pribadi. Parameter ini digunakan saat algoritma adalah algoritma asimetris.
<PrivateKey> <Value ref="private.privatekey"</Value> </PrivateKey>
| Default: | T/A |
| Kehadiran: | Opsional. Namun, Anda harus menyertakan tepat satu elemen
<PrivateKey> atau <SecretKey>.
Gunakan elemen <PrivateKey> jika algoritma adalah RS*, PS*, atau ES*,
dan gunakan elemen <SecretKey> jika algoritma adalah HS*.
|
| Jenis: | T/A |
<PrivateKey/Id>
<PrivateKey> <Id ref="flow-variable-name-here"/> </PrivateKey> or <PrivateKey> <Id>your-id-value-here</Id> </PrivateKey>
Menentukan ID kunci (kid) yang akan disertakan dalam header JWS.
| Default | T/A |
| Kehadiran | Opsional |
| Jenis | String |
| Nilai yang valid | Variabel atau string alur |
<PrivateKey/Password>
<PrivateKey> <Password ref="private.privatekey-password"/> </PrivateKey>
Tentukan sandi yang harus digunakan kebijakan untuk mendekripsi kunci pribadi, jika perlu. Gunakan atribut ref untuk meneruskan kunci dalam variabel alur.
| Default | T/A |
| Kehadiran | Opsional |
| Jenis | String |
| Nilai yang valid |
Referensi variabel alur. Catatan: Anda harus menentukan variabel alur
dengan atribut ref. Apigee akan menolak konfigurasi kebijakan yang tidak valid jika sandi ditentukan dalam teks biasa. Variabel alur
harus memiliki awalan "private". Misalnya, |
<PrivateKey/Value>
<PrivateKey> <Value ref="private.variable-name-here"/> </PrivateKey>
Menentukan kunci pribadi berenkode PEM yang digunakan untuk menandatangani JWS. Gunakan atribut ref untuk meneruskan kunci dalam variabel alur.
| Default | T/A |
| Kehadiran | Wajib saat menggunakan kebijakan untuk membuat JWS menggunakan salah satu algoritma RS*, PS*, atau ES*. |
| Jenis | String |
| Nilai yang valid |
Variabel alur yang berisi string yang merepresentasikan nilai kunci pribadi yang dienkode PEM.
Catatan: Variabel alur harus memiliki awalan "private". Misalnya,
|
<SecretKey>
<SecretKey encoding="base16|hex|base64|base64url" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.variable-here"/> </SecretKey>
Menentukan kunci rahasia yang akan digunakan saat membuat JWS yang menggunakan algoritma simetris (HS*), salah satunya adalah HS256, HS384, atau HS512.
Elemen ini bersifat opsional. Namun, Anda harus menyertakan tepat satu elemen
<PrivateKey> atau <SecretKey>.
Gunakan elemen <PrivateKey> saat membuat JWS yang ditandatangani dengan
algoritma asimetris (salah satu dari RS*, PS*, atau ES*),
dan gunakan elemen <SecretKey> saat membuat JWS yang ditandatangani dengan
algoritma simetris (algoritma seperti HS*).
Anak-anak <SecretKey>
Tabel berikut memberikan deskripsi elemen turunan dan atribut
<SecretKey>:
| Anak | Kehadiran | Deskripsi |
|---|---|---|
| encoding (atribut) | Opsional | Menentukan cara kunci dienkode dalam variabel yang dirujuk. Secara default, jika tidak ada atribut
<SecretKey encoding="hex" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.secretkey"/> </SecretKey> Pada contoh di atas, karena encoding-nya adalah |
| ID (elemen) | Opsional | ID kunci. Nilainya dapat berupa string apa pun. Anda dapat menentukan nilai sebagai
nilai teks literal, atau secara tidak langsung, melalui referensi variabel, dengan atribut <SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.variable-here"/> </SecretKey> or <SecretKey> <Id>your-id-value-here</Id> <Value ref="private.variable-here"/> </SecretKey> Kebijakan ini akan menyertakan ID kunci ini sebagai klaim |
| Nilai (elemen) | Wajib | Kunci rahasia yang dienkode. Menentukan kunci rahasia yang digunakan untuk menandatangani payload.
Gunakan atribut <SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.my-secret-variable"/> </SecretKey> Apigee menerapkan kekuatan kunci minimum untuk algoritma HS256/HS384/HS512. Panjang kunci minimum untuk HS256 adalah 32 byte, untuk HS384 adalah 48 byte, dan untuk HS512 adalah 64 byte. Menggunakan kunci dengan kekuatan yang lebih rendah akan menyebabkan error runtime. |
<Type>
<Type>type-string-here</Type>
Elemen opsional yang satu-satunya nilai yang diizinkan adalah Signed, yang menentukan bahwa kebijakan
membuat JWS bertanda tangan. <Type> disediakan
hanya untuk mencocokkan elemen yang sesuai untuk kebijakan GenerateJWT dan VerifyJWT (yang
dapat mengambil salah satu nilai Signed atau Encrypted).
| Default | T/A |
| Kehadiran | Opsional |
| Jenis | String |
| Nilai yang valid | Signed |
Variabel alur
Kebijakan Generate JWS tidak menetapkan variabel alur.
Referensi error
This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Occurs when |
|---|---|---|
steps.jws.GenerationFailed |
401 |
The policy was unable to generate the JWS. |
steps.jws.InsufficientKeyLength |
401 |
For a key less than 32 bytes for the HS256 algorithm |
steps.jws.InvalidClaim |
401 |
For a missing claim or claim mismatch, or a missing header or header mismatch. |
steps.jws.InvalidCurve |
401 |
The curve specified by the key is not valid for the Elliptic Curve algorithm. |
steps.jws.InvalidJsonFormat |
401 |
Invalid JSON found in the JWS header. |
steps.jws.InvalidPayload |
401 |
The JWS payload is invalid. |
steps.jws.InvalidSignature |
401 |
<DetachedContent> is omitted and the JWS has a detached content payload. |
steps.jws.KeyIdMissing |
401 |
The Verify policy uses a JWKS as a source for public keys, but the signed JWS does not
include a kid property in the header. |
steps.jws.KeyParsingFailed |
401 |
The public key could not be parsed from the given key information. |
steps.jws.MissingPayload |
401 |
The JWS payload is missing. |
steps.jws.NoAlgorithmFoundInHeader |
401 |
Occurs when the JWS omits the algorithm header. |
steps.jws.SigningFailed |
401 |
In GenerateJWS, for a key less than the minimum size for the HS384 or HS512 algorithms |
steps.jws.UnknownException |
401 |
An unknown exception occurred. |
steps.jws.WrongKeyType |
401 |
Wrong type of key specified. For example, if you specify an RSA key for an Elliptic Curve algorithm, or a curve key for an RSA algorithm. |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Occurs when |
|---|---|
InvalidAlgorithm |
The only valid values are: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512,
HS256, HS384, HS512. |
|
|
Other possible deployment errors. |
Fault variables
These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "TokenExpired" |
JWS.failed |
All JWS policies set the same variable in the case of a failure. | jws.JWS-Policy.failed = true |
Example error response
For error handling, the best practice is to trap the errorcode part of the error
response. Do not rely on the text in the faultstring, because it could change.
Example fault rule
<FaultRules>
<FaultRule name="JWS Policy Errors">
<Step>
<Name>JavaScript-1</Name>
<Condition>(fault.name Matches "TokenExpired")</Condition>
</Step>
<Condition>JWS.failed=true</Condition>
</FaultRule>
</FaultRules>