GSP844

Ringkasan
Apigee adalah platform untuk mengembangkan dan mengelola API. Apigee dapat membantu Anda mengamankan akses ke API dan membatasi kapasitas akses ke API tersebut. Apigee juga menyediakan fitur yang digunakan untuk mengamankan akses internal ke data API.
Dalam lab ini, Anda akan membuat API yang memerlukan token OAuth untuk akses. Anda menggunakan kebijakan SpikeArrest untuk membatasi kapasitas panggilan API berdasarkan aplikasi, dan Anda menggunakan variabel pribadi dan penyamaran data untuk menyembunyikan data sensitif dari pengguna yang men-debug traffic API.
Tujuan
Di lab ini, Anda akan mempelajari cara melakukan tugas berikut:
- Mengamankan akses ke API dengan mewajibkan token OAuth
- Membatasi kapasitas traffic secara keseluruhan dan kapasitas berdasarkan aplikasi dengan kebijakan SpikeArrest
- Menggunakan variabel pribadi dan penyamaran data untuk menyembunyikan data sensitif saat men-debug panggilan API
- Membatasi panggilan ke backend untuk resource tertentu
- Menulis ulang pesan error backend untuk melindungi dari kebocoran data
Penyiapan dan persyaratan
Sebelum mengklik tombol Start Lab
Baca petunjuk ini. Lab memiliki timer dan Anda tidak dapat menjedanya. Timer yang dimulai saat Anda mengklik Start Lab akan menampilkan durasi ketersediaan resource Google Cloud untuk Anda.
Lab interaktif ini dapat Anda gunakan untuk melakukan aktivitas lab di lingkungan cloud sungguhan, bukan di lingkungan demo atau simulasi. Untuk mengakses lab ini, Anda akan diberi kredensial baru yang bersifat sementara dan dapat digunakan untuk login serta mengakses Google Cloud selama durasi lab.
Untuk menyelesaikan lab ini, Anda memerlukan:
- Akses ke browser internet standar (disarankan browser Chrome).
Catatan: Gunakan jendela Samaran (direkomendasikan) atau browser pribadi untuk menjalankan lab ini. Hal ini akan mencegah konflik antara akun pribadi Anda dan akun siswa yang dapat menyebabkan tagihan ekstra pada akun pribadi Anda.
- Waktu untuk menyelesaikan lab. Ingat, setelah dimulai, lab tidak dapat dijeda.
Catatan: Hanya gunakan akun siswa untuk lab ini. Jika Anda menggunakan akun Google Cloud yang berbeda, Anda mungkin akan dikenai tagihan ke akun tersebut.
Catatan: Sebaiknya gunakan jendela Samaran baru untuk menyelesaikan lab ini.
Cara memulai lab dan login ke Google Cloud Console
-
Klik tombol Start Lab. Jika Anda perlu membayar lab, dialog akan terbuka untuk memilih metode pembayaran.
Di sebelah kiri ada panel Lab Details yang berisi hal-hal berikut:
- Tombol Open Google Cloud console
- Waktu tersisa
- Kredensial sementara yang harus Anda gunakan untuk lab ini
- Informasi lain, jika diperlukan, untuk menyelesaikan lab ini
-
Klik Open Google Cloud console (atau klik kanan dan pilih Open Link in Incognito Window jika Anda menjalankan browser Chrome).
Lab akan menjalankan resource, lalu membuka tab lain yang menampilkan halaman Sign in.
Tips: Atur tab di jendela terpisah secara berdampingan.
Catatan: Jika Anda melihat dialog Choose an account, klik Use Another Account.
-
Jika perlu, salin Username di bawah dan tempel ke dialog Sign in.
{{{user_0.username | "Username"}}}
Anda juga dapat menemukan Username di panel Lab Details.
-
Klik Next.
-
Salin Password di bawah dan tempel ke dialog Welcome.
{{{user_0.password | "Password"}}}
Anda juga dapat menemukan Password di panel Lab Details.
-
Klik Next.
Penting: Anda harus menggunakan kredensial yang diberikan lab. Jangan menggunakan kredensial akun Google Cloud Anda.
Catatan: Menggunakan akun Google Cloud sendiri untuk lab ini dapat dikenai biaya tambahan.
-
Klik halaman berikutnya:
- Setujui persyaratan dan ketentuan.
- Jangan tambahkan opsi pemulihan atau autentikasi 2 langkah (karena ini akun sementara).
- Jangan mendaftar uji coba gratis.
Setelah beberapa saat, Konsol Google Cloud akan terbuka di tab ini.
Catatan: Untuk mengakses produk dan layanan Google Cloud, klik Navigation menu atau ketik nama layanan atau produk di kolom Search.
Mengaktifkan Cloud Shell
Cloud Shell adalah mesin virtual yang dilengkapi dengan berbagai alat pengembangan. Mesin virtual ini menawarkan direktori beranda persisten berkapasitas 5 GB dan berjalan di Google Cloud. Cloud Shell menyediakan akses command-line untuk resource Google Cloud Anda.
-
Klik Activate Cloud Shell
di bagian atas Konsol Google Cloud.
-
Klik jendela berikut:
- Lanjutkan melalui jendela informasi Cloud Shell.
- Beri otorisasi ke Cloud Shell untuk menggunakan kredensial Anda guna melakukan panggilan Google Cloud API.
Setelah terhubung, Anda sudah diautentikasi, dan project ditetapkan ke Project_ID, . Output berisi baris yang mendeklarasikan Project_ID untuk sesi ini:
Project Cloud Platform Anda dalam sesi ini disetel ke {{{project_0.project_id | "PROJECT_ID"}}}
gcloud adalah alat command line untuk Google Cloud. Alat ini sudah terinstal di Cloud Shell dan mendukung pelengkapan command line.
- (Opsional) Anda dapat menampilkan daftar nama akun yang aktif dengan perintah ini:
gcloud auth list
- Klik Authorize.
Output:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
Untuk menetapkan akun aktif, jalankan:
$ gcloud config set account `ACCOUNT`
- (Opsional) Anda dapat menampilkan daftar ID project dengan perintah ini:
gcloud config list project
Output:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
Catatan: Untuk mendapatkan dokumentasi gcloud yang lengkap di Google Cloud, baca panduan ringkasan gcloud CLI.
Membuka konsol Apigee
Untuk membuka konsol Apigee:
- Di Konsol Google Cloud, di kolom Search, masukkan
Apigee, lalu klik Apigee API Management di hasil penelusuran.
Konsol Apigee akan terbuka, dan halaman landing akan menampilkan link cepat ke lokasi yang biasa digunakan.
- Di Navigation menu (
), di samping Apigee, klik Favorite (
).
Apigee kini ditambahkan sebagai favorit ke Navigation menu.
Tugas 1. Membuat proxy layanan backend menggunakan proxy API Apigee
Dalam tugas ini, Anda akan membuat proxy API Apigee yang bertindak sebagai facade untuk layanan backend. Proxy API ini akan menggunakan akun layanan agar dapat menampilkan token identitas OpenID Connect ke layanan Cloud Run.
Layanan backend bernama simplebank-rest telah dibuat dan di-deploy ke Cloud Run. Akun layanan juga telah dibuat untuk Anda.
Membuat proxy Apigee
-
Di Cloud Shell, gunakan perintah berikut untuk mengambil URL layanan backend:
gcloud run services describe simplebank-rest --platform managed --region {{{project_0.default_region |REGION}}} --format 'value(status.url)'
Simpan URL ini karena akan digunakan saat membuat proxy API.
-
Buka UI Apigee di Konsol Cloud.
-
Pada Navigation menu sebelah kiri, pilih Proxy development > API proxies.
-
Untuk membuat proxy baru menggunakan wizard proxy, klik + Create.
Anda akan membuat reverse proxy untuk layanan backend. Proxy API ini akan menggunakan OpenAPI Specification untuk membuat kerangka API.
-
Untuk kotak Proxy template, di OpenAPI spec template, pilih Reverse proxy (Most common).
-
Untuk File OpenAPI, buka URL di browser dan file YAML OpenAPI Specification akan didownload ke komputer Anda:
https://storage.googleapis.com/spls/gsp844/simplebank-backend.yaml
-
Klik Browse, pilih file dari komputer untuk OpenAPI file, lalu klik Next.
-
Tentukan parameter berikut untuk Proxy details:
| Properti |
Nilai |
| Proxy name |
bank-v1 |
| Base path |
/bank/v1 |
| Description |
SimpleBank read-only API |
| Target (Existing API) |
backend URL |
Catatan:
Pastikan Anda menggunakan "/bank/v1" untuk base path, bukan "/bank-v1".
Target harus berupa URL backend yang Anda ambil sebelumnya dalam tugas ini. Target akan terlihat seperti ini:
https://simplebank-rest-nu7rb74j5a-uw.a.run.app
-
Klik Next.
-
Tetap gunakan nilai default untuk setelan lainnya, lalu klik Create.
-
Klik tab Develop.
Catatan: Alur telah ditambahkan ke endpoint proxy, yang masing-masing menentukan kata kerja dan kondisi jalur salah satu operasi dari OpenAPI Specification.
Mengubah target untuk mengirim token identitas OpenID Connect
Layanan backend di-deploy untuk mewajibkan akses terautentikasi, sehingga Anda tidak dapat memanggil layanan tanpa token identitas OpenID Connect yang valid.
HTTPTargetConnection menentukan target backend untuk layanan.
-
Di menu Navigator untuk proxy, di bagian Target endpoints, klik PreFlow.
-
Temukan kode berikut (URL Anda akan berbeda):
<HTTPTargetConnection>
<URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL>
</HTTPTargetConnection>
Catatan:
Jika Anda tidak melihat bagian HTTPTargetConnection, pastikan Anda telah mengklik PreFlow di bagian Target Endpoints, bukan di bagian Proxy Endpoints.
-
Di bawah URL, tambahkan bagian Authentication yang terlihat seperti ini:
<Authentication>
<GoogleIDToken>
<Audience>AUDIENCE</Audience>
</GoogleIDToken>
</Authentication>
-
Ganti AUDIENCE dengan nilai URL yang sudah ada di bagian HTTPTargetConnection. Kode Anda kini akan terlihat mirip seperti berikut, kecuali dengan URL spesifik Anda di elemen URL dan Audience:
<TargetEndpoint name="default">
<PreFlow name="PreFlow">
<Request/>
<Response/>
</PreFlow>
<Flows/>
<PostFlow name="PostFlow">
<Request/>
<Response/>
</PostFlow>
<HTTPTargetConnection>
<URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL>
<Authentication>
<GoogleIDToken>
<Audience>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</Audience>
</GoogleIDToken>
</Authentication>
</HTTPTargetConnection>
</TargetEndpoint>
-
Klik Save.
Klik Periksa progres saya untuk memverifikasi tujuan.
Membuat proxy API
Tugas 2. Menambahkan OAuth ke proxy API
Dalam tugas ini, Anda akan menambahkan kebijakan OAuthV2 ke proxy API. Kebijakan OAuthV2 yang menggunakan operasi VerifyJWTAccessToken menerapkan verifikasi token akses saat runtime, sehingga hanya aplikasi dengan token akses OAuth yang valid yang dapat mengakses API.
Kebijakan OAuthV2 dapat membuat dan memverifikasi token buram dan Token Web JSON (JWT). Proxy API ini akan menggunakan JWT untuk token akses.
Set properti akan digunakan untuk menyimpan secret penandatanganan yang digunakan dalam pembuatan dan verifikasi JWT.
Membuat secret penandatanganan di set properti
JWT akan ditandatangani menggunakan hash-based message authentication code (HMAC). Penandatanganan kriptografi jenis ini memerlukan secret.
-
Di menu Navigator untuk proxy, di samping Resources, klik +.
-
Di dropdown Resource Type, pilih Property Set.
-
Tetapkan oauth.properties untuk Resource Name, lalu klik Add.
-
Di panel kode oauth.properties, tambahkan properti berikut:
secret=thisisnotagoodsecret,useabettersecretinproduction
Nilai ini dapat diakses dalam kode menggunakan variabel alur propertyset.oauth.secret.
Catatan:
Nilai set properti disimpan dalam teks biasa. Dalam lingkungan produksi, Anda mungkin akan menyimpan secret HMAC di lokasi terenkripsi, dan Anda pasti ingin menggunakan secret yang lebih aman (acak).
Menambahkan kebijakan AssignMessage untuk mengambil nilai set properti
Secret penandatanganan harus dimasukkan ke kebijakan OAuth dalam variabel pribadi, tetapi variabel propertyset.oauth.secret tidak bersifat pribadi. Kebijakan AssignMessage ini akan membuat variabel pribadi dari variabel set properti.
-
Di menu Navigator untuk proxy, di bagian Proxy endpoints, di bagian default, klik PreFlow.
PreFlow permintaan di endpoint proxy default merupakan alur pertama yang dijalankan saat permintaan masuk ke proxy API.
Kebijakan OAuthV2 memerlukan secret, dan akan dijalankan sangat awal di proxy API.
-
Di panel Flow, klik tombol + tepat di samping PreFlow dalam alur permintaan.
-
Pilih Create new policy dan untuk dropdown Select policy, pilih Assign Message dari bagian Mediation, lalu tetapkan Display Name dan Name ke AM-GetSecret.
-
Klik Add. Klik AM-GetSecret di bagian Policies di menu Navigator.
Konfigurasi kebijakan AssignMessage ditampilkan di panel Code.
-
Ubah konfigurasi kebijakan menjadi:
<AssignMessage name="AM-GetSecret">
<AssignVariable>
<Name>private.secretkey</Name>
<Ref>propertyset.oauth.secret</Ref>
</AssignVariable>
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>
Setelan AssignVariable menyalin variabel propertyset.oauth.secret ke dalam variabel private.secretkey.
Setelan IgnoreUnresolvedVariables menyebabkan kebijakan AssignMessage melaporkan kesalahan jika propertyset.oauth.secret tidak dapat diselesaikan.
Menambahkan kebijakan OAuthV2 untuk memverifikasi token
-
Di menu Navigator untuk proxy, di bagian Proxy endpoints, di bagian default, klik PreFlow.
Kebijakan OAuthV2 harus dijalankan setelah kebijakan AssignMessage.
-
Di panel Flow, klik tombol + tepat di samping PreFlow dalam alur permintaan.
-
Pilih Create new policy dan untuk dropdown Select policy, pilih OAuth v2.0 dari bagian Security, lalu tetapkan Display Name dan Name ke OA-VerifyToken.
-
Klik Add, lalu klik OA-VerifyToken dari Policies di menu Navigator.
Konfigurasi kebijakan OAuthV2 ditampilkan di panel Code.
-
Ubah konfigurasi kebijakan OAuthV2 menjadi:
<OAuthV2 name="OA-VerifyToken">
<Operation>VerifyJWTAccessToken</Operation>
<Algorithm>HS256</Algorithm>
<SecretKey>
<Value ref="private.secretkey"/>
</SecretKey>
</OAuthV2>
Konfigurasi menetapkan bahwa token akses JWT akan menggunakan algoritma HS256 (HMAC-SHA256), dengan menggunakan variabel pribadi yang dibuat dalam kebijakan AssignMessage sebagai kunci secret.
-
Klik Save.
Klik Periksa progres saya untuk memverifikasi tujuan.
Menambahkan kebijakan untuk memverifikasi token
Tugas 3. Menambahkan kebijakan untuk membuat token
Endpoint proxy terpisah juga akan ditambahkan ke proxy API untuk memungkinkan pembuatan token JWT.
Menambahkan endpoint proxy baru untuk operasi token
Dalam lingkungan produksi, proxy terpisah biasanya dibuat untuk membuat token. Untuk lab ini, Anda akan membuat alur pembuatan token di endpoint proxy terpisah dalam proxy API yang sama.
-
Di menu Navigator untuk proxy, pada baris Proxy endpoints, klik tombol +.
Catatan:
Jangan klik tombol "+" di samping "default".
Tindakan ini akan membuat endpoint proxy baru yang akan digunakan saat membuat JWT baru.
-
Untuk Name, tentukan token, lalu klik Add.
Endpoint proxy baru bernama token akan ditampilkan di panel Code.
-
Ubah seluruh konfigurasi alur token dari:
<ProxyEndpoint name="token">
.
.
.
</ProxyEndpoint>
menjadi:
<ProxyEndpoint name="token">
<PreFlow name="PreFlow">
<Request/>
<Response/>
</PreFlow>
<PostFlow name="PostFlow">
<Request/>
<Response/>
</PostFlow>
<Flows/>
<HTTPProxyConnection>
<BasePath>/token</BasePath>
</HTTPProxyConnection>
<RouteRule name="noTarget"/>
</ProxyEndpoint>
-
Klik Save.
Konfigurasi yang diperbarui ini menghasilkan 2 perubahan spesifik:
-
BasePath ditetapkan ke
/token. Ini adalah jalur dasar yang akan digunakan saat membuat token.
-
RouteRule tidak lagi merujuk endpoint target. Proxy API membuat token tanpa memanggil layanan backend.
Membuat alur untuk menghasilkan token
-
Di Flow untuk proxy, di bagian Proxy Endpoints: token, tepat di samping /token, klik +.
-
Untuk alur kondisional baru, tentukan nilai berikut:
| Properti |
Nilai |
| Flow Name |
generateToken |
| Condition Type |
pilih Custom
|
-
Untuk Condition, tentukan nilai ini:
(proxy.pathsuffix MatchesPath "/") and (request.verb = "POST") and (request.formparam.grant_type = "client_credentials")
Hanya permintaan token kredensial klien yang valid yang akan diizinkan.
-
Klik Add.
Melampirkan kebijakan AssignMessage untuk mengambil nilai set properti
Kebijakan OAuthV2 yang akan membuat token juga memerlukan akses ke variabel private.secretkey.
-
Di menu Navigator untuk proxy, di bagian Proxy endpoints, di bagian token, klik generateToken.
-
Di panel Flow, klik tombol + di sebelah kanan di samping generateToken dalam alur permintaan.
-
Untuk Select Policy, pilih Select Existing policy, lalu klik AM-GetSecret.
-
Klik Add.
Kebijakan AssignMessage yang sama dilampirkan ke PreFlow endpoint proxy token.
Menambahkan kebijakan OAuthV2 untuk membuat token
-
Di menu Navigator untuk proxy, di bagian Proxy endpoints, di bagian token, klik generateToken.
-
Di panel Flow, klik tombol + di sebelah kanan di samping generateToken dalam alur permintaan.
-
Untuk Select Policy, pilih Create new policy, kemudian pilih OAuth v2.0 dari bagian Security, lalu tetapkan Display Name dan Name ke OA-GenerateToken.
-
Klik Add, lalu klik OA-GenerateToken dari Policies.
Konfigurasi kebijakan OAuthV2 ditampilkan di panel Code.
-
Ubah konfigurasi kebijakan OAuthV2 menjadi:
<OAuthV2 name="OA-GenerateToken">
<Operation>GenerateJWTAccessToken</Operation>
<Algorithm>HS256</Algorithm>
<SecretKey>
<Value ref="private.secretkey"/>
</SecretKey>
<SupportedGrantTypes>
<!-- pass client_id and client_secret via basic auth header -->
<GrantType>client_credentials</GrantType>
</SupportedGrantTypes>
<!-- 1800000 ms = 1800 s = 30 min -->
<ExpiresIn>1800000</ExpiresIn>
<GenerateResponse enabled="true"/>
<RFCCompliantRequestResponse>true</RFCCompliantRequestResponse>
</OAuthV2>
Konfigurasi ini akan memungkinkan pembuatan token OAuth JWT yang akan berakhir dalam 30 menit.
Melaporkan kesalahan untuk permintaan token yang tidak valid
-
Di Flow untuk proxy, di bagian Proxy Endpoints: token, tepat di samping /token, klik +.
-
Untuk alur kondisional baru, tentukan nilai berikut:
| Properti |
Nilai |
| Flow Name |
invalidRequest |
| Condition Type |
pilih Custom
|
| Condition |
DELETETHIS |
Kondisi akan dihapus setelah alur ditambahkan karena setiap permintaan generateToken yang tidak valid harus melalui alur ini.
-
Klik Add.
-
Dalam alur invalidRequest, hapus baris berikut:
<Condition>DELETETHIS</Condition>
-
Di menu Navigator untuk proxy, di bagian Proxy endpoints, di bagian token, klik invalidRequest.
-
Di panel Flow, klik tombol + tepat di samping invalidRequest untuk alur permintaan.
-
Pilih Create new policy, kemudian pilih Raise Fault dari bagian Mediation, lalu tetapkan Display Name dan Name ke RF-InvalidTokenRequest.
-
Klik Add, lalu klik RF-InvalidTokenRequest dari Policies.
Konfigurasi kebijakan RaiseFault ditampilkan di panel Code.
-
Ubah konfigurasi kebijakan RaiseFault menjadi:
<RaiseFault name="RF-InvalidTokenRequest">
<FaultResponse>
<Set>
<StatusCode>400</StatusCode>
<ReasonPhrase>Bad Request</ReasonPhrase>
<Payload contentType="application/json">{
"error":"Bad request: use POST /token"
}</Payload>
</Set>
</FaultResponse>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>
Tindakan ini akan membuat respons 400 Bad Request jika permintaan tidak valid.
-
Klik Save.
Klik Periksa progres saya untuk memverifikasi tujuan.
Menambahkan kebijakan untuk membuat token
Tugas 4. Men-deploy proxy OAuth
Dalam tugas ini, Anda akan men-deploy proxy API dan mengonfirmasi bahwa akses memerlukan token OAuth.
Memastikan instance runtime tersedia
-
Di Cloud Shell, tempel dan jalankan serangkaian perintah berikut:
export INSTANCE_NAME=eval-instance; export ENV_NAME=eval; export PREV_INSTANCE_STATE=; echo "waiting for runtime instance ${INSTANCE_NAME} to be active"; while : ; do export INSTANCE_STATE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}" | jq "select(.state != null) | .state" --raw-output); [[ "${INSTANCE_STATE}" == "${PREV_INSTANCE_STATE}" ]] || (echo; echo "INSTANCE_STATE=${INSTANCE_STATE}"); export PREV_INSTANCE_STATE=${INSTANCE_STATE}; [[ "${INSTANCE_STATE}" != "ACTIVE" ]] || break; echo -n "."; sleep 5; done; echo; echo "instance created, waiting for environment ${ENV_NAME} to be attached to instance"; while : ; do export ATTACHMENT_DONE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}/attachments" | jq "select(.attachments != null) | .attachments[] | select(.environment == \"${ENV_NAME}\") | .environment" --join-output); [[ "${ATTACHMENT_DONE}" != "${ENV_NAME}" ]] || break; echo -n "."; sleep 5; done; echo "***ORG IS READY TO USE***";
Rangkaian perintah ini menggunakan API Apigee untuk menentukan kapan instance runtime Apigee dibuat dan lingkungan eval dilampirkan.
-
Tunggu hingga instance siap.
Saat teks ***ORG IS READY TO USE*** ditampilkan, instance siap digunakan. Organisasi Apigee (org) mungkin telah dibuat sebelum Anda memulai lab, sehingga Anda tidak perlu menunggu hingga instance dibuat.
Jika Anda sedang menunggu hingga organisasi siap, Anda dapat mempelajari OAuth, kebijakan SpikeArrest, penyamaran dan penyembunyian data, serta token buram dan JWT.
Men-deploy proxy API
-
Buka Apigee di Konsol Cloud.
-
Pada Navigation menu di sebelah kiri, pilih Proxy development > API Proxies, lalu klik bank-v1.
-
Klik tab Develop.
-
Klik Deploy, dan untuk Environment, pilih eval.
Dialog akan meminta Anda mengonfirmasi deployment.
-
Untuk Service Account, tentukan alamat email akun layanan:
apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
-
Klik Deploy dan Confirm.
-
Klik tab Overview, lalu tunggu hingga status deployment eval menunjukkan bahwa proxy berhasil di-deploy.
Klik Periksa progres saya untuk memverifikasi tujuan.
Men-deploy proxy API
Menguji proxy API
Lingkungan eval di organisasi Apigee dapat dipanggil menggunakan nama host eval.example.com. Entri DNS untuk nama host ini telah dibuat dalam project Anda, dan me-resolve alamat IP instance runtime Apigee. Entri DNS ini telah dibuat di zona pribadi, yang berarti hanya dapat dilihat di jaringan internal.
Cloud Shell tidak berada di jaringan internal, sehingga perintah Cloud Shell tidak dapat me-resolve entri DNS ini. Virtual machine (VM) dalam organisasi Anda dapat mengakses DNS zona pribadi. Virtual machine bernama apigeex-test-vm telah dibuat secara otomatis. Anda dapat menggunakan virtual machine ini untuk memanggil proxy API.
-
Di Cloud Shell, buka koneksi SSH ke VM pengujian Anda:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)")
gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
Jika diminta untuk memberikan otorisasi, klik Authorize.
-
Untuk setiap pertanyaan yang diajukan di Cloud Shell, klik Enter atau Return untuk menentukan input default.
Identitas yang Anda gunakan untuk login adalah pemilik project, sehingga SSH ke virtual machine ini diizinkan.
Sesi Cloud Shell Anda kini berjalan di dalam VM.
-
Panggil proxy API bank-v1 yang di-deploy di lingkungan eval:
curl -i -k -X GET "https://eval.example.com/bank/v1/customers"
Opsi -k memberi tahu curl untuk melewati verifikasi sertifikat TLS. Untuk lab ini, runtime Apigee menggunakan sertifikat yang ditandatangani sendiri, bukan sertifikat yang telah dibuat oleh certificate authority (CA) tepercaya.
Catatan:
Jangan gunakan opsi -k untuk melewati verifikasi sertifikat pada kasus penggunaan produksi.
API ini mencoba mengambil daftar pelanggan. Sekarang, Anda akan melihat respons 401 Unauthorized yang mirip dengan ini:
HTTP/2 401
content-type: application/json
www-authenticate: Bearer realm="null",error="invalid_token",error_description="oauth.v2.InvalidAccessToken: Invalid access token"
x-request-id: 99263881-d0f7-4495-b886-0253f28a2e05
content-length: 101
date: Tue, 11 Jan 2022 18:59:01 GMT
via: 1.1 google
{"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}
Respons ini menunjukkan bahwa proxy API telah memblokir akses ke layanan backend karena token akses tidak diberikan.
-
Masukkan perintah exit untuk keluar dari sesi SSH dan kembali ke Cloud Shell.
Tugas 5. Menambahkan produk API, developer, dan aplikasi
Dalam tugas ini, Anda akan menambahkan produk API yang akan memberikan akses ke API Anda. Anda juga akan membuat developer, lalu aplikasi yang akan dikaitkan dengan produk API Anda.
Membuat produk API
-
Buka Apigee di Konsol Cloud.
-
Pada Navigation menu di sebelah kiri, pilih Distribution > API Products.
-
Untuk membuat produk API baru, klik +Create.
-
Di panel Product details, tentukan parameter berikut:
| Properti |
Nilai |
| Name |
bank-readonly |
| Display Name |
bank (read access) |
| Environment |
pilih eval
|
| Access |
pilih Public
|
Biarkan Automatically approve access requests dipilih.
-
Di bagian Operations, klik +Add an Operation.
Operasi digunakan untuk menentukan permintaan mana di proxy API tertentu yang diizinkan untuk aplikasi yang dikaitkan dengan produk API itu.
Catatan:
Pastikan tombol berada di bagian "Operations", bukan bagian "GraphQL Operations".
-
Tentukan parameter berikut:
| Properti |
Nilai |
| API Proxy |
pilih bank-v1 API proxy |
| Path |
/** |
| Methods |
pilih GET |
Ekspresi jalur /\*\* menunjukkan bahwa permintaan apa pun yang cocok dengan jalur dasar akan diizinkan.
Di lingkungan produksi, Anda mungkin memilih untuk menambahkan setiap operasi yang diizinkan secara terpisah, alih-alih menggunakan ekspresi jalur karakter pengganti ini.
-
Klik Save untuk menyimpan operasi.
-
Untuk menyimpan produk API, di bagian atas halaman Products Detail, klik Save.
-
Kembali ke halaman Distribution > API Products.
Produk API tersebut akan tercantum.
Membuat developer aplikasi
Sebelum membuat aplikasi, Anda harus membuat developer aplikasi.
-
Pada Navigation menu di sebelah kiri, klik Distribution > Developers.
-
Untuk membuat developer aplikasi baru, klik +Create.
-
Tentukan parameter berikut:
| Properti |
Nilai |
| First Name |
Joe |
| Last Name |
Developer |
| Username |
joe |
| Email |
joe@example.com |
-
Klik Add untuk membuat developer aplikasi.
Membuat aplikasi dengan akses bank-v1
-
Pada Navigation menu di sebelah kiri, klik Distribution > Apps.
-
Untuk membuat aplikasi baru, klik +Create.
-
Di panel App details, tentukan parameter berikut:
| Properti |
Nilai |
| Name |
readonly-app |
| Developer |
pilih joe@example.com |
-
Di panel Credentials, klik Add credentials > Add products, pilih bank (read access) dari drop-down, lalu klik Add untuk menambahkannya.
-
Klik Create di pojok kanan atas untuk membuat aplikasi.
Key dan Secret kini dikonfigurasi untuk aplikasi.
-
Klik ikon Show di samping Key dan Secret.
Untuk API ini, token akses OAuth diperlukan. Kunci dan secret akan digunakan sebagai kredensial untuk aplikasi, sehingga aplikasi tersebut dapat membuat token akses OAuth.
Klik Periksa progres saya untuk memverifikasi tujuan.
Menambahkan produk API dan membuat aplikasi
Menguji API
-
Di Cloud Shell, buka koneksi SSH ke VM pengujian Anda:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)")
gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
Jika diminta untuk memberikan otorisasi, klik Authorize.
Sesi Cloud Shell Anda kini berjalan di dalam VM.
-
Untuk mendapatkan secret dan kunci pengguna untuk aplikasi, jalankan perintah berikut:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null); echo "PROJECT_ID=${PROJECT_ID}"
export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output); echo "CONSUMER_KEY=${CONSUMER_KEY}"
export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output); echo "CONSUMER_SECRET=${CONSUMER_SECRET}"
Perintah pertama membaca konfigurasi gcloud untuk mendapatkan project saat ini. Perintah kedua dan ketiga mengambil secret dan kunci pengguna menggunakan API Apigee. Permintaan diizinkan karena Anda mengirim token akses yang memiliki izin pengguna yang login.
Untuk jenis pemberian kredensial klien OAuth, aplikasi klien harus mengirimkan secret dan kunci pengguna di header Authorization untuk membuat token akses.
-
Untuk membuat token akses JWT, jalankan perintah berikut:
export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials"); echo ${TOKEN_RESPONSE}
export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output); echo "JWT_TOKEN=${JWT_TOKEN}"
Perintah pertama memanggil endpoint token, dan menyimpan respons. Token kemudian diekstrak dari respons JSON dan disimpan di JWT_TOKEN.
-
Untuk menguji permintaan menggunakan token JWT, gunakan perintah berikut:
curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/customers"
Panggilan API sekarang akan menampilkan daftar pelanggan.
Catatan:
Jika Anda mendapatkan respons yang berbunyi "Your client does not have permission to the requested URL", pastikan audiens tersebut telah ditetapkan dengan benar di tugas 1.
-
Masukkan perintah exit untuk keluar dari sesi SSH dan kembali ke Cloud Shell.
Tugas 6. Menambahkan pembatasan kapasitas
Dalam tugas ini, Anda akan menambahkan kebijakan SpikeArrest yang akan menggunakan konfigurasi kuota produk API untuk membatasi kapasitas panggilan ke API.
Kebijakan SpikeArrest melindungi API dan backend Anda dari lonjakan traffic dengan memungkinkan Anda menentukan laju traffic maksimum yang akan diizinkan. Kebijakan ini dapat digunakan untuk memastikan bahwa backend Anda tidak kewalahan menangani traffic yang tidak dapat ditanganinya.
Menambahkan kebijakan SpikeArrest untuk pembuatan token
Kebijakan SpikeArrest ini akan menentukan batas kapasitas keseluruhan untuk traffic panggilan ke API /token.
-
Buka Apigee di Konsol Cloud.
-
Pada Navigation menu di sebelah kiri, pilih Proxy development > API Proxies, lalu klik bank-v1.
-
Klik tab Develop.
-
Di menu Navigator untuk proxy, di bagian Proxy endpoints, di bagian token, klik PreFlow.
Kebijakan SpikeArrest harus dijalankan sebelum kebijakan alur kondisional.
-
Di panel Flow, klik tombol + tepat di samping PreFlow dari alur permintaan.
-
Pilih Create new policy, kemudian pilih Spike Arrest dari bagian Traffic Management, lalu tetapkan Display Name dan Name ke SA-LimitTokenRate.
-
Klik Add, lalu klik SA-LimitTokenRate di bagian Policies.
Konfigurasi kebijakan SpikeArrest ditampilkan di panel Code.
-
Ubah konfigurasi kebijakan SpikeArrest menjadi:
<SpikeArrest name="SA-LimitTokenRate">
<Rate>5pm</Rate>
<UseEffectiveCount>false</UseEffectiveCount>
</SpikeArrest>
Konfigurasi ini menentukan bahwa kapasitas permintaan maksimum yang diizinkan adalah 5 per menit. Semua traffic akan dibatasi oleh kebijakan SpikeArrest ini.
Catatan:
5 permintaan per menit digunakan untuk memfasilitasi pengujian -- batas SpikeArrest di lab ini biasanya terlalu rendah untuk skenario dunia nyata.
UseEffectiveCount yang ditetapkan ke false menentukan bahwa kebijakan SpikeArrest menggunakan algoritma Token Bucket. Traffic diperlancar dengan membagi kapasitas ke dalam interval yang lebih kecil. 5 permintaan per menit berarti 1 permintaan per seperlima menit, atau 1 permintaan setiap 12 detik. Jika permintaan kedua masuk ke Message Processor kurang dari 12 detik setelah permintaan sebelumnya, permintaan tersebut mungkin ditolak.
Menambahkan kebijakan SpikeArrest untuk permintaan API
Kebijakan SpikeArrest ini akan menentukan batas kapasitas untuk traffic panggilan ke API /bank/v1. Kapasitas tersebut akan diterapkan per aplikasi.
-
Di menu Navigator untuk proxy, di bagian Proxy endpoints, di bagian default, klik PreFlow.
Kebijakan SpikeArrest harus dijalankan di awal panggilan, tetapi harus dijalankan setelah kebijakan OAuthV2 VerifyJWTAccessToken untuk membatasi kapasitas berdasarkan aplikasi.
-
Di panel Flow, klik tombol + tepat di samping PreFlow dari alur permintaan.
-
Pilih Create new policy, kemudian pilih Spike Arrest dari bagian Traffic Management, lalu tetapkan Display Name dan Name ke SA-LimitRateByApp.
-
Klik Add, lalu klik SA-LimitRateByApp di bagian Policies.
Konfigurasi kebijakan SpikeArrest ditampilkan di panel Code.
-
Ubah konfigurasi kebijakan SpikeArrest menjadi:
<SpikeArrest name="SA-LimitRateByApp">
<Rate>5pm</Rate>
<Identifier ref="client_id" />
<UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>
Seperti kebijakan sebelumnya, konfigurasi ini menentukan bahwa kapasitas permintaan maksimum yang diizinkan adalah 5 per menit. Namun, kebijakan ini menentukan ID, yang mempertahankan kapasitas SpikeArrest secara terpisah untuk setiap client_id. Client ID diisi oleh kebijakan OA-VerifyToken, dan bersifat unik untuk setiap aplikasi developer.
UseEffectiveCount yang ditetapkan ke true menentukan bahwa penghitungan kapasitas dipertahankan untuk semua traffic dalam region. Kebijakan ini mempertahankan penghitung permintaan yang diterima per periode, yang berdurasi satu menit saat menggunakan kapasitas permintaan per menit. Penghitungan kapasitas didasarkan pada jendela geser.

Untuk contoh yang ditunjukkan di atas, asumsikan kita menggunakan kapasitas 50 permintaan per menit. Penghitung menggunakan periode satu menit, meskipun periode penghitung akan menjadi satu detik jika kapasitas ditentukan per detik. Asumsikan bahwa kita berada di detik ke-10 dalam menit saat ini, yang diwakili oleh tanda panah. Menit sebelumnya memiliki 48 permintaan, dan periode saat ini memiliki 5 permintaan sejauh ini.
Untuk mengizinkan permintaan lain, kapasitas harus kurang dari 50 permintaan per menit. Kapasitas yang dihitung adalah:
request_rate = (48 * (60-10)/60) + 6 = 46
Karena hanya 10 detik dari 60 detik yang telah berlalu dalam periode saat ini, 50 detik lainnya dihitung menggunakan kapasitas periode sebelumnya. 5/6 dari 48 adalah 40. Jika permintaan diizinkan, jumlah untuk periode saat ini adalah 5 + 1, atau 6. Penghitungan kapasitas permintaan sebesar 46 menunjukkan bahwa permintaan diizinkan karena kapasitas permintaan kurang dari 50 permintaan per menit.
-
Klik Save > Save as new revision.
-
Klik Deploy, lalu pilih eval untuk Environment.
-
Untuk Service Account, tentukan alamat email akun layanan:
apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
- Klik Deploy dan Confirm.
- Klik tab Overview, lalu tunggu hingga status deployment eval menunjukkan bahwa proxy berhasil di-deploy.
Klik Periksa progres saya untuk memverifikasi tujuan.
Menambahkan kebijakan SpikeArrest
Menguji pembatasan kapasitas
-
Di Cloud Shell, buka koneksi SSH ke VM pengujian Anda:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)")
gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
Jika diminta untuk memberikan otorisasi, klik Authorize.
Sesi Cloud Shell Anda kini berjalan di dalam VM.
-
Untuk mendapatkan secret dan kunci pengguna untuk aplikasi, jalankan perintah berikut:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null); echo "PROJECT_ID=${PROJECT_ID}"
export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output); echo "CONSUMER_KEY=${CONSUMER_KEY}"
export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output); echo "CONSUMER_SECRET=${CONSUMER_SECRET}"
-
Buat beberapa token akses dengan menjalankan perintah berikut berulang kali:
curl -i -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials"
Anda akan segera menerima respons 429 Too Many Requests, yang menunjukkan bahwa batas kapasitas telah terlampaui. Karena UseEffectiveCount ditetapkan ke false untuk kebijakan ini, traffic akan diperlancar menggunakan algoritma Token Bucket. Anda mungkin akan mendapatkan pelanggaran spike arrest sebelum permintaan ke-5.
-
Untuk menyimpan token akses JWT, jalankan perintah berikut:
export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials"); echo ${TOKEN_RESPONSE}
export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output); echo "JWT_TOKEN=${JWT_TOKEN}"
-
Untuk menguji kebijakan SpikeArrest untuk panggilan API, kirim perintah berikut berulang kali:
curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/customers"
UseEffectiveCount ditetapkan ke true, sehingga kebijakan ini menggunakan algoritma jendela geser. Anda akan dapat menerima 5 permintaan yang berhasil sebelum permintaan diblokir.
-
Masukkan perintah exit untuk keluar dari sesi SSH dan kembali ke Cloud Shell.
Tugas 7. Penyamaran data
Dalam tugas ini, Anda akan membuat penyamaran data untuk menyembunyikan kolom tertentu dalam sesi Debug.
Memulai sesi debug
Debug adalah alat untuk memecahkan masalah dan memantau proxy API yang berjalan di Apigee. Dengan alat Debug, Anda dapat memeriksa detail setiap langkah selama panggilan API.
-
Pada Navigation menu di sebelah kiri, pilih Proxy development > API Proxies, lalu klik bank-v1.
-
Klik tab Debug.
-
Di panel Start debug session, klik Start debug session. Untuk dropdown Environment, pilih lingkungan eval.
-
Klik Start.
Mungkin perlu waktu beberapa saat sebelum sesi debug mulai mencatat permintaan.
Catatan:
Jika Anda mendapatkan pesan error dalam kotak merah di dekat bagian atas layar, dengan deskripsi seperti "Error fetching debug transactions" atau "List debug session transaction error", sesi debug Anda mungkin masih berfungsi dengan benar.
Anda akan membuat permintaan API, lalu memeriksa sesi debug.
Men-debug permintaan
-
Di Cloud Shell, buka koneksi SSH ke VM pengujian Anda:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)")
gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
Jika diminta untuk memberikan otorisasi, klik Authorize.
Sesi Cloud Shell Anda kini berjalan di dalam VM.
-
Untuk mendapatkan token aplikasi, jalankan perintah berikut:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null); echo "PROJECT_ID=${PROJECT_ID}"
export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output); echo "CONSUMER_KEY=${CONSUMER_KEY}"
export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output); echo "CONSUMER_SECRET=${CONSUMER_SECRET}"
export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials"); echo ${TOKEN_RESPONSE}
export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output); echo "JWT_TOKEN=${JWT_TOKEN}"
-
Buat permintaan ini ke API:
curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/customers/abe@example.org/accounts"
-
Kembali ke halaman UI Apigee.
Halaman Debug akan menampilkan 2 permintaan: POST (membuat token) dan GET (mengambil akun untuk pengguna).
-
Klik permintaan GET.
Detail permintaan GET akan ditampilkan.
-
Klik kebijakan pertama, yaitu kebijakan AM-GetSecret yang menyalin variabel propertyset.oauth.secret ke dalam variabel private.secretkey.

Phase Details tidak menampilkan variabel pribadi karena variabel yang diawali dengan "private." disembunyikan dari sesi Debug. Namun, variabel set properti menyimpan data sensitif yang sama, dan sebaiknya sembunyikan data tersebut dari pengguna yang men-debug traffic.
-
Klik respons dari backend, yang ditunjukkan oleh lingkaran di sebelah kiri ikon pabrik.

Respons berisi akun untuk pengguna, termasuk saldo rekening.
Membuat penyamaran debug
-
Buka tab baru di jendela browser yang sama, lalu buka referensi API Apigee.
Referensi API Apigee memberikan detail untuk berbagai panggilan API yang dapat digunakan untuk mengelola Apigee, dan juga dapat digunakan untuk melakukan panggilan ke API Apigee. Halaman ini menampilkan panggilan API organization.environments.
-
Scroll ke bagian bawah halaman, lalu klik updateDebugmask.
Panggilan API ini akan memperbarui penyamaran debug untuk lingkungan.
-
Di panel Try this API, untuk parameter permintaan name, gunakan perintah berikut:
organizations/{{{ project_0.project_id | PROJECT }}}/environments/eval/debugmask
-
Untuk isi permintaan, masukkan isi berikut:
{
"responseJSONPaths": [
"$[*].balance"
],
"variables": [
"propertyset.oauth.secret"
]
}
Payload ini akan menyebabkan variabel propertyset.oauth.secret disamarkan, dan juga menyamarkan setiap kolom balance dalam array objek di payload respons.
-
Klik Execute.
Jika kotak pop-up meminta Anda memilih akun, pilih akun siswa.
-
Klik Allow untuk mengizinkan halaman menggunakan kredensial siswa.
Menguji penyamaran debug
-
Di UI Apigee, pada Navigation menu di sebelah kiri, pilih Proxy development > API Proxies, lalu klik bank-v1.
-
Klik tab Debug.
-
Di panel Start debug session, pada dropdown Environment, pilih eval.
-
Klik Start.
-
Di Cloud Shell, jika koneksi SSH telah ditutup, buka koneksi SSH ke VM pengujian Anda:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)")
gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
-
Dapatkan token dan buat permintaan API lagi:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output)
export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output)
export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials")
export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output)
curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/customers/abe@example.org/accounts"
-
Kembali ke halaman Debug di UI Apigee, lalu klik permintaan GET.
-
Klik kebijakan AM-GetSecret.
Variabel propertyset.oauth.secret disamarkan.

-
Klik Proxy Response Flow Started untuk respons backend.
Setiap kolom balance disamarkan.

Tugas 8. Penanganan error
Dalam tugas ini, Anda akan membuat alur kondisional default untuk membatasi panggilan ke resource backend tertentu, dan menulis ulang pesan error backend.
Menguji API
-
Di Cloud Shell, jika koneksi SSH telah ditutup, buka koneksi SSH ke VM pengujian Anda:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)")
gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
-
Masukkan Y untuk melanjutkan, lalu tekan ENTER dua kali untuk mengosongkan frasa sandi.
-
Dapatkan token dan buat permintaan GET ke /users:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output)
export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output)
export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials")
export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output)
curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/users"
Layanan backend tidak mengenali permintaan GET /users, sehingga menampilkan respons 404 yang terlihat seperti ini:
HTTP/2 404
x-powered-by: Express
content-security-policy: default-src 'none'
x-content-type-options: nosniff
content-type: text/html; charset=utf-8
x-cloud-trace-context: 7e96528757cc5053ba4fc8853037b02d;o=1
date: Wed, 19 Jan 2022 01:49:53 GMT
server: Google Frontend
content-length: 144
x-request-id: 2d8c8002-3152-4fc2-a60b-1729dd5483d8
via: 1.1 google
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot GET /users</pre>
</body>
</html>
Respons menampilkan payload HTML, yang tidak cocok dengan format payload RF-InvalidTokenRequest. Selain itu, respons backend dapat berisi data sensitif. Karena alasan ini, sebaiknya tulis ulang respons error dari layanan backend.
Menulis ulang pesan error 404 Not Found
Aturan kesalahan dapat digunakan untuk mendeteksi error dan menulis ulang pesan error.
Kebijakan RaiseFault akan digunakan untuk menetapkan respons baru.
-
Buka Apigee di Konsol Cloud.
-
Pada Navigation menu di sebelah kiri, pilih Proxy development > API Proxies, lalu klik bank-v1.
-
Klik tab Develop.
-
Di menu Navigator untuk proxy, di samping Policies, klik +.
-
Pilih Raise Fault dari bagian Mediation, lalu tetapkan Display Name dan Name ke RF-404NotFound.
-
Klik Create. Klik RF-404NotFound di bagian Policies.
-
Ubah konfigurasi kebijakan RaiseFault menjadi:
<RaiseFault name="RF-404NotFound">
<FaultResponse>
<Remove>
<Headers/>
</Remove>
<Set>
<StatusCode>404</StatusCode>
<ReasonPhrase>Not Found</ReasonPhrase>
<Headers>
<Header name="FaultName">{fault.name}</Header>
</Headers>
<Payload contentType="application/json">{
"error": "{request.verb} {proxy.pathsuffix} not found"
}</Payload>
</Set>
</FaultResponse>
<AssignTo createNew="true" type="response"/>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>
Bagian Remove terlebih dahulu menghapus semua header yang mungkin berasal dari layanan backend, lalu bagian Set membuat respons. Header FaultName telah ditambahkan untuk menampilkan nilai variabel fault.name saat kesalahan dilaporkan. Variabel fault.name menentukan nama kesalahan.
Membuat FaultRule
-
Di menu Navigator untuk proxy, di bagian Target endpoints, klik default.
Endpoint target default berisi panggilan target backend yang menampilkan respons 404. 404 dianggap sebagai kode kegagalan. Endpoint akan melaporkan kesalahan, dan FaultRules yang ditentukan di endpoint target dapat digunakan untuk menulis ulang respons API.
-
Dalam konfigurasi TargetEndpoint, tepat di bawah tag TargetEndpoint, tambahkan bagian FaultRules berikut:
<FaultRules>
<FaultRule name="404">
<Step>
<Name>RF-404NotFound</Name>
</Step>
<Condition>response.status.code == 404</Condition>
</FaultRule>
</FaultRules>
Bagian awal TargetEndpoint sekarang akan terlihat seperti ini:
<TargetEndpoint name="default">
<FaultRules>
<FaultRule name="404">
<Step>
<Name>RF-404NotFound</Name>
</Step>
<Condition>response.status.code == 404</Condition>
</FaultRule>
</FaultRules>
-
Klik Save > Save as new revision.
-
Klik Deploy, lalu pilih eval untuk Environment.
-
Untuk Service Account, tentukan alamat email akun layanan:
apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
-
Klik Deploy, lalu Confirm.
-
Klik tab Overview, lalu tunggu hingga status deployment eval menunjukkan bahwa proxy berhasil di-deploy.
Menguji kesalahan respons endpoint
-
Di Cloud Shell, jika koneksi SSH telah ditutup, buka koneksi SSH ke VM pengujian Anda:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)")
gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
-
Dapatkan token dan buat permintaan GET ke /users:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output)
export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output)
export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials")
export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output)
curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/users"
Respons telah ditulis ulang, dan sekarang terlihat seperti ini:
HTTP/2 404
faultname: ErrorResponseCode
content-type: application/json
x-request-id: 8d9db301-b3c7-4957-816d-93e796306dfb
content-length: 39
date: Tue, 18 Jan 2022 06:42:23 GMT
via: 1.1 google
{
"error": "GET /users not found"
}
Respons kini menggunakan JSON. Perhatikan bahwa header faultname memiliki nilai ErrorResponseCode, yang merupakan nilai variabel fault.name yang ditentukan saat target menampilkan kode kegagalan. Segera setelah respons 404 muncul dari layanan backend, kesalahan dilaporkan dan aturan kesalahan endpoint target dievaluasi. Aturan kesalahan 404 kemudian menulis ulang respons.
Menambahkan alur kondisional 404
Daripada mengandalkan backend untuk menampilkan respons saat permintaan yang tidak terduga dikirim, alur kondisional baru dapat ditambahkan di akhir alur kondisional endpoint proxy untuk melaporkan kesalahan saat tidak ada alur kondisional lain yang cocok dengan kondisinya. Hal ini menjamin bahwa hanya operasi yang tercantum dalam alur kondisional yang akan diteruskan ke backend. Dengan pola ini, Anda dapat mengizinkan akses hanya ke sebagian kecil resource layanan backend.
-
Di menu Navigator untuk proxy, buka Proxy Endpoint: default, lalu di bagian alur, klik + di samping /bank/v1.
-
Untuk alur kondisional baru, tentukan nilai berikut:
| Properti |
Nilai |
| Flow name |
404NotFound |
| Condition type |
pilih Custom
|
| Condition |
DELETETHIS |
-
Klik Add.
-
Dalam alur 404NotFound, hapus baris berikut:
<Condition>DELETETHIS</Condition>
Jika semua kondisi alur bersyarat sebelumnya tidak cocok, alur 404NotFound akan berjalan.
-
Di menu Navigator untuk proxy, di bagian Proxy endpoints, di bagian default, klik 404NotFound.
-
Di panel Flow, klik tombol + tepat di samping alur permintaan 404NotFound.
-
Untuk Select Policy, pilih Select existing policy, lalu klik RF-404NotFound.
-
Klik Add.
-
Klik Save > Save as new revision.
-
Klik Deploy, lalu pilih eval untuk Environment.
-
Untuk Service Account, tentukan alamat email akun layanan:
apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
-
Klik Deploy, lalu Confirm.
-
Klik tab Overview, lalu tunggu hingga status deployment eval menunjukkan bahwa proxy berhasil di-deploy.
Klik Periksa progres saya untuk memverifikasi tujuan.
Menambahkan penanganan error
Menguji alur kondisional 404
-
Di Cloud Shell, jika koneksi SSH telah ditutup, buka koneksi SSH ke VM pengujian Anda:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)")
gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
-
Dapatkan token dan buat permintaan GET ke /users:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output)
export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output)
export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials")
export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output)
curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/users"
Respons telah ditulis ulang, dan sekarang terlihat seperti ini:
HTTP/2 404
faultname: RaiseFault
content-type: application/json
x-request-id: d6bbd48f-65bd-4551-9236-636fad03a609
content-length: 39
date: Tue, 18 Jan 2022 07:07:58 GMT
via: 1.1 google
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
{
"error": "GET /users not found"
}
Header faultname kini memiliki nilai RaiseFault, yang merupakan nilai fault.name yang digunakan saat kebijakan RaiseFault menyebabkan kesalahan dilaporkan. Kebijakan RaiseFault dalam alur kondisional 404NotFound menghasilkan respons.
Selamat!
Di lab ini, Anda telah mengamankan API dengan mewajibkan token OAuth JWT. Anda membatasi traffic dengan menambahkan kebijakan SpikeArrest. Anda menggunakan variabel pribadi dan penyamaran data untuk menyembunyikan data sensitif dalam sesi Debug. Anda juga menulis ulang pesan error backend dan menggunakan alur kondisional 404 untuk membatasi panggilan ke backend ke resource tertentu.
Langkah berikutnya/pelajari lebih lanjut
Manual terakhir diperbarui pada 6 Agustus 2025
Lab terakhir diuji pada 6 Agustus 2025
Hak cipta 2026 Google LLC. Semua hak dilindungi undang-undang. Google dan logo Google adalah merek dagang dari Google LLC. Semua nama perusahaan dan produk lain mungkin adalah merek dagang masing-masing perusahaan yang bersangkutan.