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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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:
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Aşağıdaki tabloda Login türünün yapılandırma alanları açıklanmaktadır.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Yapılandırma örnekleri
ApsaraDB for Redis örneği kullanma
Bir ApsaraDB for Redis örneği oluşturun. Daha fazla bilgi için bkz. Genel bakış.
Çı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.
ApsaraDB for Redis örneğini yapılandırdıktan sonra örneğin VPC uç noktasını edinin. Örnek: r-xxxxxxx.redis.rds.aliyuncs.com.
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.
-
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: 6379Redis 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
expalanına göre hesaplanır. Bu, anahtarın JWT sona erene kadar depolanabileceği anlamına gelir.
Eklentinin varsayılan önerilen çıkış anahtarı ["jti"] şeklindedir; burada
jtibir JWT'yi benzersiz şekilde tanımlayan yük alanıdır. JWT standartlarında belirtildiği üzere JWT yükündekijtideğ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"}
-
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##xxxxanahtarı ApsaraDB for Redis örneğinde depolanır. -
Çı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
expalanı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
pathile 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.
Eklentinin varsayılan önerilen oturum açma anahtarı ["iss","aud","sub"] şeklindedir. Bu anahtarda
issJWT yayıncısını,audJWT kullanım senaryosunu vesubJWT 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"}
-
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#abcdanahtarı ApsaraDB for Redis örneğinde depolanır ve değer mevcut JWT'dekiyle aynıdır. -
İ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
jtialanı iki JWT arasında farklıdır. Bu nedenle JWT'ye dayalı erişim isteği reddedilir. -
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#abcdanahtarı 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ı
|
|
|
|
|
|
|
|
|
|
|
|