Arka plan: OAuth 1.0a ve 2.0 için istemci ve sunucu yığınları yazdım.
Hem OAuth 1.0a hem de 2.0 , bir sunucunun kullanıcı kimliğinden emin olduğu iki aşamalı kimlik doğrulamayı ve bir sunucunun kullanıcı kimliğinin içerik sağlayıcısı tarafından sağlandığı üç aşamalı kimlik doğrulamayı destekler . Üç aşamalı kimlik doğrulama, yetkilendirme isteklerinin ve erişim belirteçlerinin devreye girdiği yerdir ve OAuth 1'in de bunlara sahip olduğunu belirtmek önemlidir.
Karmaşık olan: üç aşamalı kimlik doğrulama
OAuth teknik özelliklerinin ana noktası, bir içerik sağlayıcısının (örn. Facebook, Twitter vb.) Bir sunucunun (örneğin, istemci adına içerik sağlayıcıyla konuşmak isteyen bir Web uygulaması) istemcinin kimliğine sahip olmasını sağlamaktır . Üç aşamalı kimlik doğrulamanın sunduğu şey, istemci veya sunucu bu kimliğin ayrıntılarını (ör. Kullanıcı adı ve şifre) bilmek zorunda kalmadan bunu yapabilmektir .
OAuth'un ayrıntılarına çok fazla girmeden:
- İstemci, istemcinin hizmetinin meşru bir istemcisi olduğunu doğrulayan sunucuya bir yetkilendirme isteği gönderir.
- Sunucu, kaynaklarına erişim istemek için istemciyi içerik sağlayıcıya yönlendirir.
- İçerik sağlayıcısı kullanıcının kimliğini doğrular ve genellikle kaynaklara erişmek için izin ister.
- İçerik sağlayıcı istemciyi sunucuya yönlendirir ve başarılı veya başarısız olduğunu bildirir. Bu istek, başarı ile ilgili bir yetkilendirme kodu içerir.
- Sunucu, içerik sağlayıcısına bant dışı bir istekte bulunur ve yetkilendirme kodunu bir erişim belirteciyle değiştirir.
Sunucu artık erişim belirtecini ileterek kullanıcı adına içerik sağlayıcısına istekte bulunabilir.
Her exchange (istemci-> sunucu, sunucu-> içerik sağlayıcısı) paylaşılan bir sırrın doğrulanmasını içerir, ancak OAuth 1 şifrelenmemiş bir bağlantı üzerinden çalışabildiğinden, her doğrulama sırrı kablo üzerinden geçiremez.
Bu, HMAC ile belirttiğiniz gibi yapılır. İstemci, yetkilendirme isteği için bağımsız değişkenleri imzalamak üzere sunucu ile paylaştığı sırrı kullanır. Sunucu, bağımsız değişkenleri alır, istemcinin anahtarıyla imzalar ve meşru bir istemci olup olmadığını görebilir (yukarıdaki 1. adımda).
Bu imza, hem istemcinin hem de sunucunun bağımsız değişkenlerin sırası üzerinde anlaşmasını gerektirir (bu nedenle tam olarak aynı dizeyi imzalarlar) ve OAuth 1 ile ilgili ana şikayetlerden biri hem sunucunun hem de istemcilerin sıralama ve aynı şekilde imzalayın. Bu fiddly kodu ve ya doğru ya 401 Unauthorized
da az yardım ile olsun . Bu, istemci yazma engeli artar.
OAuth 2.0, yetkilendirme isteğinin SSL üzerinden çalışmasını gerektirerek, bağımsız değişken sıralama ve imzalama gereksinimini tamamen ortadan kaldırır. İstemci sırrını doğrudan doğrulayan sunucuya iletir.
Aynı gereksinimler sunucu-> içerik sağlayıcısı bağlantısında da mevcuttur ve OAuth hizmetlerine erişen bir sunucu yazma önündeki bir engeli kaldıran SSL olduğu için.
Bu yukarıdaki 1, 2 ve 5. adımlarda işleri çok daha kolay hale getirir.
Bu noktada sunucumuz, kullanıcı için bir kullanıcı adı / parola eşdeğeri olan kalıcı bir erişim belirtecine sahiptir. Bu erişim belirtecini isteğin bir parçası olarak (sorgu bağımsız değişkeni, HTTP üstbilgisi veya POST form verileri olarak) geçirerek kullanıcı adına içerik sağlayıcısına istekte bulunabilir.
İçerik hizmetine yalnızca SSL üzerinden erişilirse işimiz bitti. Düz HTTP üzerinden kullanılabiliyorsa, bu kalıcı erişim belirtecini bir şekilde korumak istiyoruz. Bağlantıyı koklayan herkes, kullanıcının içeriğine sonsuza kadar erişebilir.
OAuth 2'de çözülen yol bir yenileme jetonudur . Yenileme belirteci kalıcı şifre eşdeğeri olur ve yalnızca SSL üzerinden iletilir . Sunucunun içerik hizmetine erişmesi gerektiğinde, yenileme belirtecini kısa ömürlü bir erişim belirteciyle değiştirir. Bu şekilde tüm koklanabilir HTTP erişimleri, süresi dolacak bir belirteçle yapılır. Google, OAuth 2 API'larında 5 dakikalık bir sona erme süresi kullanıyor.
Yenileme simgelerinin yanı sıra, OAuth 2 istemci, sunucu ve içerik sağlayıcısı arasındaki tüm iletişimi basitleştirir. Yenileme simgeleri yalnızca içeriğe şifrelenmeden erişildiğinde güvenlik sağlamak için bulunur.
İki aşamalı kimlik doğrulama
Ancak bazen bir sunucunun yalnızca kendi içeriğine erişimi denetlemesi gerekir. İki aşamalı kimlik doğrulama, istemcinin kullanıcıyı doğrudan sunucu ile doğrulamasını sağlar.
OAuth 2, yaygın olarak kullanılan bazı uzantıları OAuth 1'e standart hale getirir. En iyi bildiğim Twitter tarafından xAuth olarak tanıtıldı . OAuth 2'de Kaynak Sahibi Parolası Kimlik Bilgileri olarak görebilirsiniz .
Temel olarak, istemciye kullanıcının kimlik bilgileriyle (kullanıcı adı ve parola) güvenebilirseniz, bunları doğrudan bir erişim belirteci için içerik sağlayıcıyla değiştirebilirler. Bu, OAuth'u mobil uygulamalarda çok daha kullanışlı hale getirir - üç aşamalı kimlik doğrulamayla, içerik sunucusuyla yetkilendirme sürecini işlemek için bir HTTP görünümü yerleştirmeniz gerekir.
OAuth 1 ile bu, resmi standardın bir parçası değildi ve diğer tüm taleplerle aynı imzalama prosedürünü gerektiriyordu.
Kaynak Sahibi Parola Kimlik Bilgileri ile OAuth 2'nin sunucu tarafını yeni uyguladım ve bir müşterinin bakış açısından, erişim belirtecini almak basitleşti: sunucudan bir erişim belirteci isteyin, istemci kimliğini / sırrını bir HTTP Yetkilendirme başlığı ve form verisi olarak kullanıcının oturum açma adı / şifresi.
Avantajı: Sadelik
Dolayısıyla, uygulayıcının bakış açısından, OAuth 2'de gördüğüm temel avantajlar karmaşıklığın azalmasıdır. Tam olarak zor olmayan ama kesinlikle işe yarayan istek imzalama prosedürünü gerektirmez. Bir hizmetin müşterisi olarak hareket etmek için gereken işi büyük ölçüde azaltır (bu, modern, mobil dünyada) ağrıyı en aza indirmek istediğiniz yerdir. Sunucu-> içerik sağlayıcı sonundaki karmaşıklığın azalması veri merkezinde daha ölçeklenebilir olmasını sağlar.
Ve standart olarak şu anda geniş kullanımda olan OAuth 1.0a'nın bazı uzantılarını (xAuth gibi) kodlar.