genel bakış
Benim uygulama için bir (REST) API oluşturmak için arıyorum. İlk / birincil amaç mobil uygulamalar (iPhone, Android, Symbian, vb.) Tarafından tüketim içindir. Web tabanlı API'ler için kimlik doğrulama ve yetkilendirme için farklı mekanizmalar araştırıyorum (diğer uygulamaları inceleyerek). Başımı temel kavramların çoğuna sartım, ancak hala birkaç alanda rehberlik arıyorum. Yapmak istediğim son şey tekerleği yeniden icat etmek, ancak kriterlerime uyan herhangi bir standart çözüm bulamıyorum (ancak kriterlerim yanlış yönlendirildi, bu yüzden de eleştirmekten çekinmeyin). Ayrıca, API'yi tüketen tüm platformlar / uygulamalar için aynı olmasını istiyorum.
OAuth
Sunulan ilk çözüm olacağını bildiğim için devam edeceğim ve oAuth'a itirazımı atacağım. Mobil uygulamalar (veya daha özel olarak web dışı uygulamalar) için, kimlik doğrulaması için uygulamadan ayrılmak (bir web tarayıcısına gitmek) yanlış görünüyor. Ayrıca, tarayıcının geri aramayı uygulamaya (özellikle çapraz platform) geri döndürmesinin bir yolu (farkındayım) yoktur. Bunu yapan bir kaç uygulama biliyorum, ama yanlış geliyor ve uygulama UX'da mola veriyor.
Gereksinimler
- Kullanıcı uygulamaya kullanıcı adı / şifre girer.
- Her API çağrısı arayan uygulama tarafından tanımlanır.
- Genel gider minimumda tutulur ve kimlik doğrulaması geliştiriciler için sezgiseldir.
- Mekanizma hem son kullanıcı (giriş kimlik bilgileri gösterilmez) hem de geliştirici (uygulama kimlik bilgileri gösterilmez) için güvenlidir.
- Mümkünse, https gerektirmez (kesinlikle zor bir gereklilik değildir).
Uygulamayla İlgili Mevcut Düşüncelerim
Harici bir geliştirici bir API hesabı isteyecektir. Apikey ve apisecret alacaklar. Her istek en az üç parametre gerektirir.
- apikey - geliştiriciye kayıt sırasında verilen
- timestamp - belirli bir apikey için her mesaj için benzersiz bir tanımlayıcı olarak iki katına çıkar
- karma - zaman damgasının karma değeri + apisecret
Apikey, talebi veren uygulamayı tanımlamak için gereklidir. Zaman damgası, oauth_nonce öğesine benzer şekilde davranır ve tekrar saldırılarını önler / azaltır. Karma, söz konusu isteğin sahibinin isteğinin gerçekte yapılmasını sağlar.
Kimliği doğrulanmış istekler için (bir kullanıcı adına yapılanlar), hala bir erişim_düzeni yolu veya bir kullanıcı adı ve parola karma combo ile gitmek arasında kararsızım. Her iki durumda da, bir noktada bir kullanıcı adı / şifre kombinasyonu gerekir. Bu durumda, birkaç bilgi parçasından oluşan bir karma (apikey, apisecret, zaman damgası) + şifre kullanılır. Bu konuda geri bildirim almak isterim. FYI, parolaları karma olmadan sistemime kaydetmediğim için önce parolayı hash etmek zorunda kalacaklardı.
Sonuç
Bilginize, bu genel olarak API'nın nasıl oluşturulacağı / yapılandırılacağı, sadece bir uygulama içinden kimlik doğrulama ve yetkilendirmenin nasıl ele alınacağı konusunda bir talep değildir.
Rastgele Düşünceler / Bonus Sorular
Yalnızca isteğin bir parçası olarak bir apikey gerektiren API'ler için, apikey sahibi dışında birisinin apikey'i görmesini (açık bir şekilde gönderildiği için) ve kullanım sınırlarını aşmak için aşırı istekler almasını nasıl önlersiniz? Belki de bunu biraz düşündüm, ama apikey sahibine bir isteğin doğrulandığını doğrulayacak bir şey olmamalı mı? Benim durumumda, apisecret'in amacı buydu, asla karma olmadan gösterilmez / iletilmez.
Hashlerden bahsetmişken, md5 vs hmac-sha1 ne olacak? Tüm değerlerin yeterince uzun verilerle (yani apisecret) birleştirilmesi gerçekten önemli mi?
Önceden kullanıcılarımın şifre karmasına bir kullanıcı / satır tuzu eklemeyi düşünüyordum. Bunu yapsaydım, uygulama, kullanılan tuzu bilmeden nasıl eşleşen bir karma oluşturabilirdi?