Tüm Ürünler
Search
Belge Merkezi

API Gateway:JWT-logout

Son Güncelleme:Oct 10, 2026

jwt-logout eklentisi, JSON Web Token (JWT) için zayıf durum yönetimini Redis kullanarak uygular. Bu sayede JWT'lerin proaktif olarak geçersiz kılınması ve tek cihazda oturum açma kontrolü sağlanır. Örneğin, bir kullanıcı yeni bir cihazdan oturum açtığında önceki oturum otomatik olarak sonlandırılır.

Eklenti türü

Kimlik doğrulama ve yetkilendirme eklentisi.

Alanlar


Alan


Veri türü


Gerekli


Varsayılan değer


Açıklama


jwks


string


Hayır


-


JWT doğrulaması için kullanılan JSON dizesi. Bu eklenti jwt-auth eklentisi ile birlikte kullanıldığında gerekli değildir. Daha fazla bilgi için bkz. JSON Web Key (JWK).


clock_skew


number


Hayır


60


JWT içindeki exp ve iat alanları doğrulanırken izin verilen saat sapması. Birim: saniye.


token_header


string


Hayır


Authorization


JWT'nin çıkarıldığı istek üstbilgisi.


token_prefix


string


Hayır


"Bearer"


Üstbilgi değeri öneki. Önek kaldırıldıktan sonra kalan kısım JWT olarak kullanılır.


redis


Redis


Evet


-


Redis hizmeti yapılandırması.


logout


Logout


Hayır


-


JWT çıkış özelliği yapılandırması. Yapılandırılmazsa JWT çıkışı devre dışı bırakılır.


login


Login


Hayır


-


JWT tek cihazda oturum açma özelliği yapılandırması. Yapılandırılmazsa tek cihazda oturum açma devre dışı bırakılır.

Aşağıdaki tabloda Redis türünün yapılandırma alanları açıklanmaktadır.

Alan

Veri türü

Gerekli

Varsayılan değer

Açıklama

service

string

Evet

-

Redis hizmetinin adı. Örnekler:

  • Sabit adres: my-redis.static

  • DNS etki alanı adı: my-redis.dns

  • ACK: my-redis.default.svc.cluster.local

port

number

Evet

-

Redis hizmetinin bağlantı noktası numarası.

username

string

Hayır

-

Redis AUTH komutu için kullanıcı adı.

password

string

Hayır

-

Redis AUTH komutu için parola.

timeout

number

Hayır

1000

Redis komutları için zaman aşımı süresi. Birim: milisaniye.

Aşağıdaki tabloda Logout türünün yapılandırma alanları açıklanmaktadır.


Alan


Veri türü


Gerekli


Varsayılan değer


Açıklama


key_prefix


string


Hayır


higress_jwt_logout_


Redis'te depolanan anahtarın öneki.


key


array of string


Hayır


["jti"]


Bir JWT'yi tanımlayan JWT yükündeki anahtar. Aynı anahtar birden çok JWT yükünde görünüyorsa bu JWT'ler aynı kabul edilir. Anahtar JWT yükünde yoksa 401 geçersiz belirteç hatası döndürülür.


path


string


Hayır


/jwt_logout


URL yolu sonekini eşleştirmek için kullanılan dize. Eşleşirse mevcut istekteki JWT geçersiz kılınır ve artık kullanılamaz.


error_status


number


Hayır


401


Oturumu kapatılmış bir JWT kullanıldığında döndürülen HTTP durum kodu.


error_body


string


Hayır


'{"message":"invalid token"}'


Oturumu kapatılmış bir JWT kullanıldığında döndürülen yanıt gövdesi.


ttl


number


Hayır


-


Redis'te depolanan anahtarın yaşam süresi (TTL). Birim: saniye. Çıkış işleminden sonra JWT'nin ne kadar süreyle geçersiz kalacağını belirler. Belirtilmezse TTL, yükteki exp alanının değerinden geçerli zaman çıkarılarak hesaplanır. Yük exp alanını içermiyorsa varsayılan TTL 86.400 saniye (24 saat) olur.

Aşağıdaki tabloda Login türünün yapılandırma alanları açıklanmaktadır.


Alan


Veri türü


Gerekli


Varsayılan değer


Açıklama


key_prefix


string


Hayır


higress_jwt_logout_


Redis'te depolanan anahtarın öneki.


key


array of string


Hayır


["iss","aud","sub"]


JWT yükündeki tek cihazda oturum açma tanımlayıcısı. Mevcut istek JWT'si daha önce kimliği doğrulanmış bir JWT ile aynı alan değerlerini içeriyor ancak tam olarak aynı JWT değilse istek yinelenen oturum açma olarak reddedilir. Kimliği doğrulanmış JWT için Redis anahtarı sona erene kadar erişim engellenir. Alan JWT yükünde yoksa 401 geçersiz belirteç hatası döndürülür.


path


string


Hayır


/jwt_login


URL yolu sonekini eşleştirmek için kullanılan dize. Eşleşirse mevcut istek JWT'si etkin oturum belirteci haline gelir ve aynı yük özelliklerine sahip önceden kimliği doğrulanmış tüm JWT'ler geçersiz kılınır.


error_status


number


Hayır


403


Yinelenen oturum açma denemelerinde döndürülen HTTP durum kodu.


error_body


string


Hayır


'{"message":"already login on other device"}'


Yinelenen oturum açma denemelerinde döndürülen yanıt gövdesi.


ttl


number


Hayır


-


Redis'te depolanan anahtarın TTL değeri. Birim: saniye. Tek cihazda oturum açma JWT'sinin geçerlilik süresini belirler. Belirtilmezse TTL, yükteki exp alanının değerinden geçerli zaman çıkarılarak hesaplanır. Yük exp alanını içermiyorsa varsayılan TTL 86.400 saniye (24 saat) olur.

Yapılandırma örnekleri

ApsaraDB for Redis örneği kullanma

  1. Bir ApsaraDB for Redis örneği oluşturun. Daha fazla bilgi için bkz. Genel bakış.

  2. Çıkış ve oturum açma yapılandırmalarını etkinleştirin. Eklenti bir isteği işlediğinde çıkış yapılandırması denetimi için bir Redis okuma isteği ve oturum açma yapılandırması denetimi için iki Redis okuma isteği oluşturulur. Çıkış veya ilk kez oturum açma gibi nadir durumlarda ek olarak iki Redis yazma isteği oluşturulur. ApsaraDB for Redis örneğinin kapasitesini tahmin etmek için eklenti tarafından işlenen isteklerin aktarım hızını 2 ile çarpabilirsiniz.

  3. ApsaraDB for Redis örneğini yapılandırdıktan sonra örneğin VPC uç noktasını edinin. Örnek: r-xxxxxxx.redis.rds.aliyuncs.com.

  4. Bir hizmet ekleyin. Hizmet Kaynağı açılır listesinden DNS Domain Name seçeneğini belirleyin, Hizmet Bağlantı Noktası alanına Redis bağlantı noktası numarasını (çoğu durumda 6379) girin, Etki Alanı Adları alanına VPC uç noktasını girin ve TLS Mode açılır listesinden Disabled seçeneğini belirleyin. Daha fazla bilgi için bkz. Hizmet oluşturma.

  5. ApsaraDB for Redis örneğine bağlanmak için eklenti yapılandırmasına aşağıdaki içeriği ekleyin:

    redis:
      service: redis.dns
      port: 6379

    Redis hizmeti için bir parola yapılandırdıysanız aşağıdaki içeriği ekleyin:

    redis:
      service: redis.dns
      port: 6379
      password: ****** # Enter the password that you specify.

JWT çıkış özelliğini uygulama

Kullanım senaryoları

JWT'ler, sona erene kadar geçerli kalan durumsuz belirteçlerdir. jwt-logout eklentisini kullanarak belirli bir JWT'nin süresi dolmadan zorla geçersiz kılınmasını sağlayabilirsiniz.

Nasıl çalışır

  • İstek yolunun soneki eklenti yapılandırmasındaki yol ile eşleşirse çıkış mekanizması tetiklenir. ApsaraDB for Redis örneği çıkış için JWT'yi kaydeder. ApsaraDB for Redis örneğinde depolanan anahtar, yapılandırılan önekten ve mevcut JWT yükünden çıkarılan anahtar ile değerden oluşur.

  • İsteğin taşıdığı JWT'nin yükü, ApsaraDB for Redis örneğinde depolanan anahtarın özellikleriyle eşleşirse sistem mevcut JWT'yi geçersiz kabul eder ve isteği reddeder.

  • ApsaraDB for Redis örneğinde depolanan anahtarın varsayılan sona erme süresi, JWT yükündeki exp alanına göre hesaplanır. Bu, anahtarın JWT sona erene kadar depolanabileceği anlamına gelir.

Not
  • Eklentinin varsayılan önerilen çıkış anahtarı ["jti"] şeklindedir; burada jti bir JWT'yi benzersiz şekilde tanımlayan yük alanıdır. JWT standartlarında belirtildiği üzere JWT yükündeki jti değeri ApsaraDB for Redis örneğinde kaydedilenle aynıysa tüm JWT tamamen aynıdır. Bu nedenle jti, bir JWT'nin çıkış durumunu işaretlemek için kullanılabilir.

  • ApsaraDB for Redis örneğinde depolanan anahtarın birleştirme kuralı: <key_prefix><PayloadKey>##<PayloadValue>. PayloadKey, diyez işareti (#) ile ayrılmış anahtar listesidir. PayloadValue, diyez işareti (#) ile ayrılmış anahtar değeri listesidir. Örnek: higress_jwt_logout_jti#iss##xxxxx#abcde.

  • Bu eklenti yalnızca çıkış sırasında mevcut istekte taşınan belirteci geçersiz kılabilir. Ayrıca önceki anahtar birleştirme kuralına dayanarak ApsaraDB for Redis konsolunda belirteci manuel olarak belirtebilirsiniz. Ağ geçidi anahtarın ApsaraDB for Redis örneğinde bulunduğunu tespit ederse ilgili JWT'ye dayalı erişim isteğini reddeder.

Örnek

Eklenti yapılandırması:

redis:
  service: redis.dns
  port: 6379
jwks: |
  {
    "keys": [
      {
        "kty": "oct",
        "kid": "123",
        "k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
        "alg": "HS256"
      }
    ]
  }
logout:
  path: "/jwt_logout"
  key: ["jti"]
  error_status: 401
  error_body: |
    {"message":"invalid token"}
  1. Bir çıkış işlemi tetikleyin.

    curl  http://xxx.hello.com/test/jwt_logout -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJ4eHh4IiwiaXNzIjoiYWJjZCIsInN1YiI6InRlc3QiLCJhdWQiOiJ3d3cudGVzdC5jb20iLCJpYXQiOjE2NjU2NjA1MjcsImV4cCI6MTg2NTY3MzgxOX0.tmKF6qc1mOWNyCCzBOT2XKNoEGeEgr3EbhTKAQfq1io'
    
    # The following result is returned:
    {"message": "logout success"}

    Belirteç yükü:

    {
        "jti": "xxxx",
        "iss": "abcd",
        "sub": "test",
        "aud": "www.test.com",
        "iat": 1665660527,
        "exp": 1865673819
    }

    Bu durumda higress_jwt_logout_jti##xxxx anahtarı ApsaraDB for Redis örneğinde depolanır.

  2. Çıkış işleminden sonra JWT'ye dayalı erişime izin verilmez.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJ4eHh4IiwiaXNzIjoiYWJjZCIsInN1YiI6InRlc3QiLCJhdWQiOiJ3d3cudGVzdC5jb20iLCJpYXQiOjE2NjU2NjA1MjcsImV4cCI6MTg2NTY3MzgxOX0.tmKF6qc1mOWNyCCzBOT2XKNoEGeEgr3EbhTKAQfq1io'
    
    # The following result is returned:
    {"message":"invalid token"}

JWT'lere dayalı zorlu çıkış uygulama

Kullanım senaryoları

Bir hesap JWT kimlik doğrulamasıyla birden çok cihazdan oturum açtığında her cihaz için farklı JWT'ler verilebilir. jwt-logout eklentisini kullanarak aynı anda yalnızca bir oturumun etkin kalmasını sağlayan tek cihazda oturum açmayı zorlayabilirsiniz.

Nasıl çalışır

  • Bir istek başlatıldığında sistem mevcut istekten JWT'yi çıkarır ve yapılandırılan önekle mevcut JWT yükünden çıkarılan anahtar ve değere dayalı bir Redis anahtarı oluşturur. Ardından sistem ApsaraDB for Redis örneğinde anahtara karşılık gelen değeri sorgular. Değer mevcut JWT'nin anahtar değeriyle tutarsızsa sistem erişim isteğini reddeder.

  • Değer yoksa mevcut JWT Redis anahtarına yazılır. ApsaraDB for Redis örneğindeki anahtarın varsayılan sona erme süresi JWT yükündeki exp alanına göre hesaplanır. Bu, anahtarın JWT sona erene kadar depolanabileceği anlamına gelir. JWT'nin geçerlilik süresi boyunca aynı yük özelliklerine sahip diğer JWT'lere dayalı erişim isteklerine izin verilmez.

  • İstek soneki eklenti yapılandırmasındaki path ile eşleşirse zorlu çıkış mekanizması tetiklenir ve mevcut JWT ilişkili Redis anahtarının değerine yazılır. Başarılı oturum açmada kullanılan ve aynı yük özelliklerine sahip JWT çıkış sırasında geçersiz kılınır. Bu sayede tek cihazda oturum açma sağlanır.

Not
  • Eklentinin varsayılan önerilen oturum açma anahtarı ["iss","aud","sub"] şeklindedir. Bu anahtarda iss JWT yayıncısını, aud JWT kullanım senaryosunu ve sub JWT konusunu belirtir. Çoğu durumda bu kombinasyon tek cihazda oturum açmayı sağlamak için kullanılabilir.

  • ApsaraDB for Redis örneğinde depolanan anahtarın birleştirme kuralı: <key_prefix><PayloadKey>##<PayloadValue>. PayloadKey, diyez işareti (#) ile ayrılmış anahtar listesidir. PayloadValue, diyez işareti (#) ile ayrılmış anahtar değeri listesidir. Örnek: higress_jwt_login_iss#aud#sub##xxxxx#abcde#fffff.

  • Aynı yük özelliklerine sahip JWT'ler için isteklerde kullanılan ilk JWT otomatik olarak ApsaraDB for Redis örneğine yazılır. Bu, eklentinin tek cihazda oturum açma özelliğini uygulamaya yardımcı olur. Bu nedenle zorlu oturum açma API işlemini çağırmanız gerekmez. API işlemini yalnızca oturum açma senaryolarında zorlu çıkış gerektiğinde çağırmanız gerekir.

  • Çıkış mantığını tetiklediğinizde ApsaraDB for Redis örneğinde depolanan mevcut JWT'nin oturum açma anahtarı temizlenir. Bu kural JWT çıkış özelliğini etkinleştirdiğinizde de geçerlidir.

Örnek

Eklenti yapılandırması:

redis:
  service: redis.dns
  port: 6379
jwks: |
  {
    "keys": [
      {
        "kty": "oct",
        "kid": "123",
        "k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
        "alg": "HS256"
      }
    ]
  }
login:
  path: "/jwt_login"
  key: ["iss","aud","sub"]
  error_status: 403
  error_body: |
    {"message":"already login on other device"}
  1. Başarılı bir oturum açma işlemi gerçekleştirin.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJ6enp6IiwiaXNzIjoiYWJjZCIsImF1ZCI6Ind3dy5leGFtcGxlLmNvbSIsInN1YiI6InRlc3QiLCJpYXQiOjE2NjU2NjA1MjcsImV4cCI6MTg2NTY3MzgxOX0.WljMr5ucxfLF8SmeaaL25c0QG3IX04HoD0als9gglYg'

    Belirteç yükü:

    {
        "jti": "zzzz",
        "iss": "abcd",
        "aud": "www.example.com",
        "sub": "test",
        "iat": 1665660527,
        "exp": 1865673819
    }

    Bu durumda higress_jwt_login_iss#aud#sub##abcd#www.example.com#abcd anahtarı ApsaraDB for Redis örneğinde depolanır ve değer mevcut JWT'dekiyle aynıdır.

  2. İstekteki JWT yükü aynı yük özelliklerine sahip olduğunda bir erişim isteğini reddedin.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJqdGkiOiJ5eXl5eSIsImlzcyI6ImFiY2QiLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjY1NjYwNTI5LCJleHAiOjE4NjU2NzM4MTl9.6vi6eKPWSKHQxfzBPrj3-SWI4Q5zGtWhqp38JIN3FEo'
    
    # The following result is returned:
    {"message":"already login on other device"}

    Belirteç yükü:

    {
        "jti": "yyyyy",
        "iss": "abcd",
        "aud": "www.example.com",
        "sub": "test",
        "iat": 1665660527,
        "exp": 1865673819
    }

    Mevcut JWT ile 1. Adımdaki JWT için yük özellikleri aynıdır. Ancak karakteristik olmayan jti alanı iki JWT arasında farklıdır. Bu nedenle JWT'ye dayalı erişim isteği reddedilir.

  3. Zorlu oturum açma gerçekleştirin.

    curl  http://xxx.hello.com/test/jwt_login -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJqdGkiOiJ5eXl5eSIsImlzcyI6ImFiY2QiLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjY1NjYwNTI5LCJleHAiOjE4NjU2NzM4MTl9.6vi6eKPWSKHQxfzBPrj3-SWI4Q5zGtWhqp38JIN3FEo'
    
    # The following result is returned:
    {"message":"login success"}

    Bu durumda higress_jwt_login_iss#aud#sub##abcd#www.example.com#abcd anahtarı ApsaraDB for Redis örneğinde depolanır ve değer mevcut JWT'deki değerle değiştirilir.

    Sayfaya başarılı şekilde erişmek için mevcut JWT'yi kullanın.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJqdGkiOiJ5eXl5eSIsImlzcyI6ImFiY2QiLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjY1NjYwNTI5LCJleHAiOjE4NjU2NzM4MTl9.6vi6eKPWSKHQxfzBPrj3-SWI4Q5zGtWhqp38JIN3FEo'

    1. Adımdaki JWT'yi kullanırsanız bir hata iletisi döndürülür.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJqdGkiOiJ4eHh4IiwiaXNzIjoiYWJjZCIsImF1ZCI6Ind3dy5leGFtcGxlLmNvbSIsInN1YiI6InRlc3QiLCJpYXQiOjE2NjU2NjA1MjcsImV4cCI6MTg2NTY3MzgxOX0.P0WtBTHJzUJvklu9q8XSRszfPbgojrZHg7t4ZaYfKGo'
    
    # The following result is returned:
    {"message":"already login on other device"}

Hata kodları


HTTP durum kodu


Hata iletisi


Neden


401


invalid token


İstek üstbilgisinde JWT sağlanmamış, JWT biçimi geçersiz veya JWT'nin süresi dolmuş ya da geçersiz kılınmıştır.


500


redis server error


ApsaraDB for Redis örneğine ulaşılamıyor veya bağlantı zaman aşımına uğradı.