REST API Kimlik Doğrulaması


181

Bir sunucuda barındırılacak bir uygulama oluşturuyorum. Herhangi bir platformdan (Web Uygulaması, Mobil Uygulama) etkileşimi kolaylaştırmak için uygulama için bir API oluşturmak istiyorum. Anlamadığım şey, REST API'sini kullanırken, kullanıcının kimliğini nasıl doğrulayacağımızdır.

Örneğin, bir kullanıcı oturum açtıktan sonra bir forum konusu oluşturmak istediğinde. Kullanıcının zaten giriş yaptığını nasıl bileceğim?


4
Muhtemelen burada "REST kimlik doğrulaması" aramalısınız. Diğer birçok soruda ele alındı.
Brian Kelly

10
Özetle, istemcinin HTTP Temel Kimlik Doğrulaması'nı (SSL üzerinden!) Kullanarak her istekle bir kullanıcı adı ve şifre göndermesine izin verin veya bir kez kimlik doğrulaması yapın; web çerçevenizin 'oturum yönetimi). Adı geçen oturum daha sonra bir çerezde saklanabilir veya her istekle iletilen bir parametre olabilir (örn. Java ülkesinde JSESSIONID).
opyate


@opyate güvenlik açısından bakıldığında, saldırganlar kullanıcı izni olmadan istek gönderebildiğinden, oturumun bir REST API durumunda çerezleri kullanarak ele alınması iyi bir fikir değildir. HTTP üstbilgisine (Yetkilendirme gibi) bir oturum karması veya belirteci eklemek daha iyidir.
s3v3n

1
@ s3v3n Yanılıyorsam beni düzeltin, ancak hem sizin hem de önerilerim aynı şeyi etkilemek için bir başlık + yerel depolama kombo kullanmanın farklı yollarından. It adlı Authorizationbaşlık + örn tarayıcı localStorage VS Cookiebaşlık + standart tarayıcı çerez depolama.
opyate

Yanıtlar:


72

HTTP Temel veya Özet Kimlik Doğrulaması kullanabilirsiniz. Üstünde SSL kullanarak kullanıcıları güvenli bir şekilde doğrulayabilirsiniz, ancak API'yı biraz yavaşlatır.

  • Temel kimlik doğrulama - kullanıcı adı ve parolada Base64 kodlaması kullanır
  • Özet kimlik doğrulaması - kullanıcı adını ve şifreyi ağ üzerinden göndermeden önce hash eder.

OAuth alabileceği en iyisidir. OAuth'un sağladığı avantajlar, iptal edilebilir veya süresi doldurulabilir bir simgedir. Nasıl uygulayacağınız konusunda aşağıdakilere bakın: Yorumlardan Çalışma Bağlantısı: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf


4
Lütfen bu soruyu ve cevabı Les Hazelwood'un (Apache Shiro'nun yazarı) sağladığı cevabı okuyun .
justin.hughey

1
Faydalı bağlantı Twitter nasıl REST API korur? Twitter REST API Güvenlik
WildDev

Kabul edilen cevap bu olduğundan, Özet kimlik doğrulamasını da kullanabileceğinizi belirtmek önemlidir. Temel ve Özet kimlik doğrulama arasındaki farkları buradan okuyun: stackoverflow.com/questions/9534602/…
Rayee Roded

116

Örneğin, bir kullanıcı giriş yaptığında, şimdi kullanıcının bir forum konusu oluşturmak istediğini söyleyelim, Kullanıcının zaten giriş yaptığını nasıl bileceğim?

Bir düşünün - "Forum Oluştur" API'nıza bu mevcut isteğin kimliği doğrulanmış bir kullanıcıdan geldiğini söyleyen bir el sıkışma olmalıdır. REST API'leri tipik olarak vatansız olduğundan, durum bir yerde kalıcı olmalıdır . REST API'lerini tüketen müşteriniz bu durumu korumaktan sorumludur. Genellikle, kullanıcı oturum açtığından bu yana geçen bazı simge biçimindedir. Simge iyi ise, isteğiniz iyidir.

Amazon AWS'nin nasıl kimlik doğrulaması yaptığını kontrol edin. Bu, bir API'dan diğerine "parayı geçirmenin" mükemmel bir örneğidir.

* Önceki cevabıma bazı pratik yanıtlar eklemeyi düşündüm. Apache Shiro'yu (veya herhangi bir kimlik doğrulama / yetkilendirme kitaplığını) deneyin. Alt satırda, özel kodlamayı deneyin ve kaçının. Favori kitaplığınızı (Apache Shiro, btw kullanıyorum) entegre ettikten sonra aşağıdakileri yapabilirsiniz:

  1. Şunun gibi bir Giriş / çıkış API'si oluşturun: /api/v1/loginveapi/v1/logout
  2. Bu Giriş ve Çıkış API'larında, kullanıcı mağazanızla kimlik doğrulaması yapın
  3. Sonuç, JSESSIONIDistemciye (web, mobil, her neyse) geri gönderilen bir jeton (genellikle )
  4. Bu noktadan sonra, müşteriniz tarafından yapılan sonraki tüm çağrılar bu jetonu içerecektir
  5. Diyelim ki bir sonraki çağrınız adlı bir API'ya yapılıyor /api/v1/findUser
  6. Bu API kodunun yapacağı ilk şey, jetonu kontrol etmektir ("bu kullanıcı doğrulandı mı?")
  7. Yanıt HAYIR olarak gelirse, istemciye bir HTTP 401 Durumu atarsınız. Bırakın halledelim.
  8. Yanıt EVET ise, istenen Kullanıcıyı iade etmeye devam edin

Bu kadar. Bu yardımcı olur umarım.


Açıkladığınız şey aslında bir oturum çerezi, değil mi?
LordOfThePigs

evet, ancak oturum 2 farklı yerde "korunur". Biri API sunucusunda, diğeri Tarayıcıda. Başarılı bir giriş sonrası tarayıcıya verilen JSON (veya her neyse) yanıtı, API sunucusundaki oturum kimliğini tekrar tarayıcıya iletmelidir. Bu oturumlar bağımsız olarak kendi temsilcileri tarafından yönetilir.
Kingz

11
Kingz'in oturumu sürdürme mekanizmasının kasıtlı olarak belirsiz olduğu fikrini vermeye çalıştığına inanıyorum. Oturum çerezi bu mekanizmanın yalnızca bir uygulamasıdır.
justin.hughey

2
@Kingz, Bu çözümdeki güvenlik hakkında, örneğin herhangi bir bilgisayar korsanı bağlantıyı session_id ile koklar ve session_id içeriğini doğrulayan istekleri göndermeye başlarsa ne olur? Sunucu bağlantısına ssl ekleyerek çözebiliriz, ama istemciler ne olacak?
Ahmad Samilo

1
adam-in-the-middle-attrack davada oturum kaçırma nasıl önlenir
m0z4rt

38
  1. İstemcilerin kimliğini doğrulamak için HTTP Temel Yetkilendirme'yi kullanın , ancak kullanıcı adını / şifreyi yalnızca geçici oturum belirteci olarak kabul edin .

    Oturum simgesi yalnızca her HTTP isteğine eklenmiş bir üstbilgidir , örneğin: Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    Yukarıdaki Ym9ic2Vzc2lvbjE6czNjcmV0 dizesi yalnızca Base64'te kodlanmış "bobsession1: s3cret" dizesidir (bir kullanıcı adı / paroladır).

  2. Yukarıdaki geçici oturum jetonunu elde etmek için http://mycompany.com/apiv1/login, ana kullanıcı adını ve ana parolayı girdi olarak alan, sunucu tarafında geçici bir HTTP Temel Kimlik Doğrulama kullanıcı adı / parolası oluşturan ve jetonu döndüren (örn: Ym9ic2Vzc2lvbjE6czNjcmV0). Bu kullanıcı adı / şifre geçici olmalı, süresi 20 dakika sonra bitmelidir.

  3. Ek güvenlik için REST hizmetinizin HTTPS üzerinden sunulduğundan emin olun, böylece bilgilerin düz metin aktarılmaz

Java kullanıyorsanız, Spring Security kitaplığı yukarıdaki yöntemi uygulamak için iyi destek sağlar


1
Neden 20 dakika sonra sona ermeli? kullanıcı oturumu kapatıncaya kadar girişin facebook gibi bir web sitesi olması durumunda ne olur?
Dejell

1
@dejel Ben "oturum" geçici olarak varsayım altında idi. Kullanıcının boşta
kalması

Base64 ne işe yarıyor? Geçici şifreyi geri verebilirsiniz. Her iki durumda da, asıl önemli olan bu geçici şifrenin güçlü olmasıdır. Güvenliği
et.stackexchange.com/a/19686/72945

7

Bence en iyi yaklaşım OAuth2 kullanmaktır. Google'ı seçtiğinizde, kurmanıza yardımcı olacak birçok yararlı yayın bulacaksınız.

Bir web uygulamasından veya mobil uygulamadan API'nız için istemci uygulamaları geliştirmeyi kolaylaştıracaktır.

Umarım size yardımcı olur.


2
Lütfen bu soruyu ve cevabını Les Hazelwood'un (Apache Shiro'nun yazarı) okuyun.
justin.hughey

0

JWT kimlik doğrulamasını kullanıyorum. Benim uygulamada gayet iyi çalışıyor.

Kullanıcı kimlik bilgilerini gerektirecek bir kimlik doğrulama yöntemi vardır. Bu yöntem, kimlik bilgilerini doğrular ve başarılı olması durumunda bir erişim belirteci döndürür.

Bu belirteç, isteğin başlığında Web API'mdaki diğer tüm yöntemlere gönderilmelidir.

Uygulanması oldukça kolay ve test edilmesi çok kolay.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.