All Products
Search
Document Center

Alibaba Cloud Service Mesh:FAQ tentang JWT

Last Updated:Aug 28, 2026

Topik ini menyediakan jawaban atas pertanyaan umum mengenai otentikasi JSON Web Token (JWT) di Alibaba Cloud Service Mesh (ASM), termasuk dukungan algoritma JWT, konfigurasi JwksUri untuk layanan di dalam dan di luar kluster, serta pengecualian otentikasi berbasis path.

Prasyarat

  • Instans ASM telah dibuat.

  • Untuk konfigurasi terkait JwksUri, diperlukan ASM versi 1.13 atau yang lebih baru.

  • kubeconfig untuk kluster bidang data telah dikonfigurasi agar dapat menjalankan perintah kubectl.

Algoritma JWT apa saja yang didukung oleh ASM?

  • Versi ASM sebelum 1.13 hanya mendukung algoritma RSA.

  • ASM 1.13 dan versi setelahnya mendukung algoritma JWT berikut: ES256, ES384, ES512, HS256, HS384, HS512, RS256, RS384, RS512, PS256, PS384, PS512, dan EdDSA.

Bagaimana cara menggunakan JwksUri di ASM?

Anda harus menggunakan Alibaba Cloud Service Mesh versi 1.13 atau yang lebih baru. Terdapat dua cara untuk menggunakan JwksUri:

  • Jika JwksUri mengarah ke layanan di dalam kluster, Anda dapat mengonfigurasinya secara langsung.

  • Jika JwksUri mengarah ke layanan di luar kluster, Anda harus mengonfigurasi ServiceEntry yang sesuai.

    Topik ini menggunakan contoh JWT dan Jwks resmi dari Istio sebagai referensi. Untuk informasi lebih lanjut, lihat JWT dan Jwks.

Gunakan alamat JwksUri di dalam kluster

Topik ini mengasumsikan bahwa alamat JwksUri merupakan alamat dalam kluster yang dikelola oleh Service Mesh. nginx-proxy adalah layanan di dalam kluster. Titik akhir /get_jwks-nya pada Port 80 mengembalikan informasi kunci publik jwks, dan JwksUri-nya adalah http://nginx-proxy.{Namespace}.svc.cluster.local:80/get_jwks.

  1. Jalankan perintah berikut untuk memeriksa apakah titik akhir get_jwks di kluster tersedia.

    curl nginx-proxy/get_jwks

    Output yang diharapkan:

    { "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-e****","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65p****-P7KfIupjf59vsdo91bSP9C8H07pSAGQ****_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5****_pbhLdKXbi66GlVeK6ABZOUW3WYt****-91gVuoeJT_DwtGGcp4ignkgXfkiE****-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoU****_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZ****_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqT****_EyxOGuHJrLsn00****"}]}

    Tanggapan 200 dengan data kunci menunjukkan bahwa titik akhir get_jwks tersedia.

  2. Lakukan otentikasi permintaan.

    1. Masuk ke Konsol ASM.

    2. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

    3. Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.

    4. Di panel navigasi sebelah kiri, klik Mesh Security CenterRequestAuthentication.

    5. Pada halaman RequestAuthentication, klik Create from YAML, pilih Namespaces target dan Scenario Template apa pun, konfigurasi YAML berikut, lalu klik Create.

      apiVersion: security.istio.io/v1beta1
      kind: RequestAuthentication
      metadata:
        name: jwt-example
        namespace: foo
      spec:
        jwtRules:
          - issuer: testing@secure.istio.io
            jwksUri: 'http://nginx-proxy/get_jwks'
        selector:
          matchLabels:
            app: httpbin
  3. Gunakan kubeconfig bidang data dan jalankan perintah berikut untuk mengakses layanan httpbin.

# Tetapkan variabel lingkungan TOKEN.
TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.14/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode -
# Akses layanan httpbin dengan JWT dari Pod sleep.
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"

Kode status 200 mengonfirmasi bahwa permintaan berhasil.

Gunakan alamat JwksUri di luar kluster

Contoh berikut didasarkan pada protokol HTTP. Jika Anda perlu menggunakan HTTPS untuk mendapatkan Jwks, konfigurasikan DestinationRule tambahan untuk ServiceEntry tersebut.

  1. Buat ServiceEntry untuk alamat remote.

    a. Gunakan konten YAML berikut untuk membuat file service-entry.yaml.

    apiVersion: networking.istio.io/v1beta1
    kind: ServiceEntry
    metadata:
      name: external-svc-https
      namespace: foo
    spec:
      addresses:
        - 11.11.XX.XX   # Ganti dengan alamat layanan Jwks eksternal Anda.
      endpoints:
        - address: 11.11.XX.XX  # Ganti dengan alamat layanan Jwks eksternal Anda.
      hosts:
        - 11.11.XX.XX  # Ganti dengan alamat layanan Jwks eksternal Anda.
      location: MESH_EXTERNAL
      ports:
        - name: http
          number: 80
          protocol: HTTP
        - name: https
          number: 443
          protocol: HTTPS      
      resolution: STATIC

    b. Jalankan perintah berikut untuk menerapkan ServiceEntry.

    kubectl apply -f service-entry.yaml
    • (Opsional) Jika layanan jwks Anda memerlukan protokol HTTPS, Anda harus mengonfigurasi DestinationRule tambahan untuk ServiceEntry tersebut.

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: external-svc-https
      namespace: foo
    spec:
      host: <your-service-entry-host>
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
        portLevelSettings:
          - port:
              number: 443
            tls:
              mode: SIMPLE
  2. Lakukan otentikasi permintaan.

    1. Masuk ke Konsol ASM.

    2. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

    3. Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.

    4. Di panel navigasi sebelah kiri, klik Mesh Security CenterRequestAuthentication.

    5. Pada halaman RequestAuthentication, klik Create from YAML, pilih Namespaces target dan Scenario Template apa pun, konfigurasi YAML berikut, lalu klik Create.

      apiVersion: security.istio.io/v1beta1
      kind: RequestAuthentication
      metadata:
        name: jwt-example
        namespace: foo
      spec:
        jwtRules:
          - issuer: testing@secure.istio.io
            jwksUri: '${YOUR_EXTERNAL_JWKS_URI}'
        selector:
          matchLabels:
            app: httpbin
  3. Jalankan perintah berikut untuk menetapkan variabel lingkungan TOKEN dan melakukan uji akses dari Pod sleep.

# Tetapkan variabel lingkungan TOKEN.
TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.14/security/tools/jwt/samples/demo.jwt -s)
# Akses layanan httpbin dengan JWT dari Pod sleep.
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"

Kode status 200 mengonfirmasi bahwa permintaan berhasil.

Bagaimana cara melewati otentikasi JWT untuk permintaan ke path tertentu?

Konsol ASM menyediakan fitur kebijakan otorisasi. Anda dapat mengonfigurasi exclusion match dalam kebijakan otorisasi untuk mengotentikasi permintaan ke path selain path yang ditentukan.

  1. Deploy dan akses layanan-layanan tersebut.

    a. Deploy aplikasi contoh Bookinfo di kluster yang terkait dengan instans ASM. Untuk informasi lebih lanjut, lihat Deploy aplikasi di kluster yang terkait dengan instans ASM.

    b. Jalankan perintah berikut untuk mengakses ketiga layanan berikut dan pastikan setiap path tersedia.

    curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -sS -o /dev/null  -w "%{http_code}\n"
    curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -sS -o /dev/null  -w "%{http_code}\n"
    curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -sS -o /dev/null  -w "%{http_code}\n"

    Ketiga layanan mengembalikan 200, yang menunjukkan bahwa layanan tersebut dapat diakses.

  2. Buat RequestAuthentication.

    1. Masuk ke Konsol ASM.

    2. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

    3. Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.

    4. Di panel navigasi sebelah kiri, klik Mesh Security CenterRequestAuthentication.

    5. Pada halaman RequestAuthentication, klik Create from YAML, pilih Namespaces target dan Scenario Template apa pun, konfigurasi YAML berikut, lalu klik Create.

      apiVersion: security.istio.io/v1beta1
      kind: RequestAuthentication
      metadata:
        name: jwt-example
        namespace: istio-system
      spec:
        jwtRules:
          - issuer: testing@secure.istio.io
            jwks: >-
              { "keys":[
              {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-e****","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQ****_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5****_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVu****_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoU****_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZ****_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqT****_EyxOGuHJrLsn00****"}]}
        selector:
          matchLabels:
            app: istio-ingressgateway

      RequestAuthentication ini diterapkan pada gerbang ASM dan berlaku untuk semua permintaan yang melewati gerbang tersebut. Setelah RequestAuthentication dikonfigurasi, baik permintaan tanpa JWT maupun permintaan dengan JWT yang benar tetap diizinkan. Hanya permintaan yang membawa JWT salah yang ditolak.

  3. Buat AuthorizationPolicy.

    Konfigurasikan permintaan ke path tertentu agar tidak perlu membawa JWT, sedangkan permintaan ke path lainnya harus membawa JWT. Topik ini menggunakan path /productpage sebagai contoh. Otentikasi JWT tidak dilakukan untuk path /productpage. Untuk dua path selain /productpage, permintaan harus membawa JWT yang benar agar lolos.

    1. Masuk ke Konsol ASM.

    2. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

    3. Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.

    4. Di panel navigasi sebelah kiri, klik Mesh Security CenterAuthorizationPolicy.

  4. Pada halaman AuthorizationPolicy, klik Create from YAML, pilih Namespaces target dan Scenario Template apa pun, masukkan konfigurasi YAML berikut, lalu klik Create.

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: test-exclude
      namespace: istio-system
    spec:
      action: DENY
      rules:
        - from:
            - source:
                notRequestPrincipals:
                  - '*'
          to:
            - operation:
                notPaths:
                  - /productpage
      selector:
        matchLabels:
          app: istio-ingressgateway

    AuthorizationPolicy ini juga berlaku untuk gerbang ASM. Kebijakan ini terutama mengonfigurasi satu aturan DENY: permintaan ke path selain /productpage akan ditolak jika tidak menyertakan JWT yang valid.

Lakukan uji akses.

a. Jalankan perintah berikut untuk menetapkan JWT yang dibawa dalam permintaan sebagai variabel lingkungan TOKEN.

export TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1****.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5p****.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9****-LS9qd_vpdLG4Tn1A15NxfCjp5f7Q****-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZz****__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCg****_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3Uc1MI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvH****_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8****

b. Jalankan perintah berikut untuk mengakses tiga path layanan tersebut.

  • Permintaan tidak membawa JWT:

curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -sS -o /dev/null  -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -sS -o /dev/null  -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -sS -o /dev/null  -w "%{http_code}\n"

Output yang diharapkan:

200
403
403

Hanya path /productpage yang dapat diakses. Semua path lainnya mengembalikan 403.

  • Semua permintaan membawa JWT:

curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null  -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null  -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null  -w "%{http_code}\n"

Output yang diharapkan:

200
200
200

Ketiga path mengembalikan 200, yang menunjukkan bahwa semuanya dapat diakses.