OAuth 2.0 Resource Owner Password Credentials Request ve Response

16 Ağu

Uygulamaların yetkilendirilmesi için yapılan access token talebi sırasında doğrudan kullanıcı adı ve şifre bilgilerini isteyen bir yöntemdir.

Resource Owner Password Credentials Grant Request

Request için gerekli parametreler:

  • grant_type : Zorunlu parametredir. Alacağı değer “password” olmalıdır.
  • username : Zorunlu parametredir. Kaynak sahibinin kullanıcı adıdır.
  • password : Zorunlu parametredir. Kaynak sahibinin şifresidir.
  • scope : İsteğe bağlı parametredir. Yetki kapsamını belirtir.

Resource Owner Password Credentials Grant Response

Authorization Server tarafındancevap olarak JSON formatında bir nesne döner.

  • access_token : Zorunlu parametredir. Authorization Server tarafından üretilen şifreli bilgidir.
  • token_type : Zorunlu parametredir. Authorization Server tarafından belirlenen token türüdür.
  • expires_in : İsteğe bağlı parametredir. Access token için belirlenen saniye cinsinden geçerlilik süresidir. Süre bittiğinde token artık geçersizdir.
  • refresh_token : Zorunlu parametredir. Access token süresi dolduğunda yeni bir token elde etmek için kullanılacak olan parametredir.

OAuth 2.0 Authorization Code Request ve Response

15 Ağu

Authorization Code ile yetkilendirilen uygulamalar Confidential Client türündeki yani sunucu taraflı çalışan uygulamalardır. Bu tür uygulamaların Authorization Server tarafından yetkilendirmesi iki aşamada ve dört basamakta gerçekleşir.

  1. Authorization Request
  2. Authorization Response
  3. Token Request
  4. Token Response

1- Authorization Request

Web uygulaması için gerekli kodu (Authorization Code) elde etmek için Authorization Endpoint’e gönderilen taleptir. Kullanılan parametreler:

  • response_type : Zorunlu parametredir. Alacağı değer “code” olmalıdır.
  • client_id Zorunlu parametredir. Authorization Server tarafından önceden verilmiştir.
  • redirect_uri : İsteğe bağlı parametredir. İstemci tarafından belirlenir.
  • scope : İsteğe bağlı parametredir Talebin kapsamını belirler.
  • state : İsteğe bağlı parametredir.

2- Authorization Response

Authorization Request sonucunda Authorization Server tarafından uygulamaya dönen cevaptır. Parametreler:

  • code : Zorunlu parametredir. Yetkilendirme kodu.
  • state : Request parametresi olarak belirtilmişse cevapta dönmesi zorunludur.

Authorization Error Response

Authorization sırasında bir hata oluşursa iki durum söz konusu olacaktır.

  1. Kullanıcının yetkilendirilemediği veya tanınmadığı durum. Bu durum geçersiz bir Redirect URI belirlendiğinde veya kullanıcı kimlik bilgileri bilinmediği durumlarda ortaya çıkar.
  2. Kullanıcı doğrulanır fakat başka bir durumdan dolayı hatanın meydana geldiği durum. Bu gibi durumlarda kullanıcıya dönen cevap şu şekilde olacaktır.
  • error : Zorunlu parametredir. Hatanın ne olduğunu belirten mesajdır.
  • error_description : Geliştiricilere bilgi veren isteğe bağlı bir parametredir.
  • error_uri : Hata hakkında bilgi veren bir web sayfasının adresini veren isteğe bağlı parametredir.
  • state : Request sırasında belirlenmiş ise cevapta dönmesi zorunludur.

3- Token Request

Yetkilendirme kodu (Authorization Code) alındıktan sonra uygulama bu kodu access token elde etmek için kullanır. Token elde etmek için token endpoint adresine talepte bulunulur. Access token talebi için parametreler:

  • client_id : Zorunlu parametredir. Authorization Server tarafından önceden verilir.
  • client_secret : Zorunlu parametredir. Authorization Server tarafından önceden verilir.
  • grant_type : Zorunlu parametredir. Alacağı değer “authorization_code” şeklindedir.
  • code : Zorunlu parametredir. Authorization Request ile elde edile koddur.
  • redirect_uri : Eğer Authorization Request sırasında belirlenmiş ise belirtilmesi gereken zorunlu parametredir.

4-Token Response

JSON formatında access token bilgisini veren cevaptır. Cevap parametreleri:

  • access_token : Zorunlu parametredir. Authorization Server tarafından üretilen şifreli bilgidir.
  • token_type : Zorunlu parametredir. Authorization Server tarafından belirlenen token türüdür.
  • expires_in : İsteğe bağlı parametredir. Access token için belirlenen saniye cinsinden geçerlilik süresidir. Süre bittiğinde token artık geçersizdir.
  • refresh_token : Zorunlu parametredir. Access token süresi dolduğunda yeni bir token elde etmek için kullanılacak olan parametredir.

 

OAuth 2.0 Implicit Request ve Response

13 Ağu

OAuth 2.0 protokolünde javascript gibi  Public Client türündeki uygulamalarda access token elde etmek için Token Endpoint adresine talepte bulunulur.

Implicit Request

Implicit yetkilendirme için token talebi için gerekeli parametreler şu şekildedir:

  • response_type : Zorunlu parametredir. Alacağı değer “token” olmalıdır.
  • client_id Zorunlu parametredir. Authorization Server tarafından önceden verilmiştir.
  • redirect_uri : İsteğe bağlı parametredir. İstemci tarafından belirlenir.
  • scope : İsteğe bağlı parametredir Talebin kapsamını belirler.
  • state : İsteğe bağlı parametredir.

Implicit Response

Imlicit talebine karşılık olarak JSON formatında bir içerik döner.

  • access_token : Zorunlu parametredir. Authorization Server tarafından üretilen şifreli bilgidir.
  • token_type : Zorunlu parametredir. Authorization Server tarafından belirlenen token türüdür.
  • expires_in : İsteğe bağlı parametredir. Access token için belirlenen saniye cinsinden geçerlilik süresidir. Süre bittiğinde token artık geçersizdir.
  • refresh_token : Zorunlu parametredir. Access token süresi dolduğunda yeni bir token elde etmek için kullanılacak olan parametredir.

Implicit Error Response

Authorization sırasında bir hata oluşursa iki durum söz konusu olacaktır.

  1. Kullanıcının yetkilendirilemediği veya tanınmadığı durum. Bu durum geçersiz bir Redirect URI belirlendiğinde veya kullanıcı kimlik bilgileri bilinmediği durumlarda ortaya çıkar.
  2. Kullanıcı doğrulanır fakat başka bir durumdan dolayı hatanın meydana geldiği durum. Bu gibi durumlarda kullanıcıya dönen cevap şu şekilde olacaktır.
  • error : Zorunlu parametredir. Hatanın ne olduğunu belirten mesajdır.
  • error_description : Geliştiricilere bilgi veren isteğe bağlı bir parametredir.
  • error_uri : Hata hakkında bilgi veren bir web sayfasının adresini veren isteğe bağlı parametredir.
  • state : Request sırasında belirlenmiş ise cevapta dönmesi zorunludur.

OAuth 2.0 Protocol Endpoints

10 Ağu

OAuth 2.0 protokolünde tanımlanmış üç adet endpoint vardır. Bunlardan iki tanesi authorization server endpoint, bir tanesi ise client endpoint şeklindedir.

  1. Authorization Endpoint (Server)
  2. Token Endpoint (Server)
  3. Redirection Endpoint (Client)

Endpoint olarak adlandırılan kavram web server üzerinde tanımlanan bir URI adresidir. Protokole dair bağlantılar tanımlanan bu adresler üzerinden sağlanmaktadır.


Authorization Endpoint

Authorization Server üzerinde yetkilendirme amacıyla tanımlanan bir (URI) adrestir. Amacı kaynak sahibinden(Resource Owner) istemci uygulamanın(Client Applicaiton) kaynağa erişebilmesi için yetki alabilmesidir.

Authorization Server öncelikle kaynak sahibinin kimlik bilgilerini doğrular. Ancak kullanıcı kimlik doğrulama işlemi OAuth 2.0 protokolü kapsamının dışında bir işlemdir. Yani kullanıcılar Facebook, Twitter veya Google üzerindeki hesaplar olabileceği gibi şirketinize ait bir veri tabanında da bulunuyor olabilir. Bu durumda doğrulama yükü dış kaynaklı bir sürece dahildir.


Token Endpoint

Authorization Server üzerinde istemci uygulamalara(Client Applicaiton) access token sağlamak amacıyla tanımlanan (URI) adrestir. Uygulama eğer Confidential Client türünde ise doğrulama kodu (authorization code), Client ID, Client Secret gibi bilgiler karşılığında access token bilgisi elde edilir. Eğer Public Client türünde bir uygulama ise kullanıcı adı ve şifre bilgileri ile access token elde edilir.

Güvenli bir ortamda veri alışverişini sağlamak açısından Authorization Endpoint ve Token Endpoint için tanımlanan adresler için TLS(SSL) gerekliliği aranmalıdır.


Redirection Endpoint

Yetkilendirme işlemi gerçekleştiğinde, kaynak sahibinin (Resource Owner) yönlendirileceği bir aderstir (URI). Bu adres Client Applicaiton içerisinde tanımlanmaktadır.

OAtuh 2.0 Authorization Grant Flow

9 Ağu

OAuth 2.0 protokolünde Client Application (istemci uygulama) protokol kapsamında belirlenen bir akış dahilinde Resource Server üzerindeki korunmuş verilere erişebilmektedir. Bu akışa OAuth 2.0 protokolünde protocol flow denir. Bir uygulamanın Resource Server tarafına erişebilmesi için öncelikle Authorization Server tarafından yetkilendirilmesi gerekmektedir. Bu yazıda yetkilendirme adımlarının nasıl gerçekleştirildiği üzerinde durulmaktadır.

Client Application bir Resource Server üzerindeki korunmuş bir veriye erişmek istediğinde ihtiyaç duyduğu yetkiyi Authorization Server üzerinden alır. Bu nedenle yetkilendirilecek olan her Client Application öncelikle  Authorization Server üzerine kaydedilmelidir. Bu sayede hangi uygulamanın yetkilendirilecek uygulama olduğu Authorization Server tarafından bilinir ve belirlenen liste haricindeki uygulamalara geçit verilmez. Uygulamanın Authorization Server üzerine kaydı bir kez gerçekleştirilir ve kayıt silinene kadar uygulama sistemde geçerli kalır.

Bir uygulama Authorization Server üzerine kaydedildiğinde, uygulamaya özel bir Client ID ve Client Secret şeklinde benzersiz iki yetki belgesi verilir. Resource Server üzerinde korunmuş verilere erişmek isteyen her Client Application kendi Client ID ve Client Secret bilgisini Authorization Server üzerinden doğrular. Authorization Server üzerine kaydedilen Client Application için kaydedilen bir diğer parametre ise Redirect URI’dır. Bu parametre Resource Owner için başarılı bir şekilde yetkilendirme gerçekleştirildiğinde yönlendirme yapmak için kullanılır. Örneğin kullanıcı adı ve şifresini doğru giren bir kullanıcının ana sayfaya yönlendirilmesi bu şekilde gerçekleştirilebilir.

OAuth 2.0 teknolojisinde yetki verme işlemi Authorization Grant olarak adlandırılır.

Authorization Grant (Yetki Verme)

Client Application yetkilendirmesi sırasında Authorization Server ile Resource Server işbirliği içerisinde hareket eder.

OAuth 2.0 protokolünde teknik olarak dört farklı yetkilendirme seçeneği bulunmaktadır.

  1. Authorization Code
  2. Implicit
  3. Resource Owner Password Credendials
  4. Client Credentials

Bir uygulamaya yetki verme işlemi sırasında birden fazla adımdan meydana gelen bir dolaşım söz konusudur. Bu dolaşım yada akış OAuth 2.0 teknolojisinde Flow olarak adlandırılır.

Tüm akışlar (flow) her durumda kullanılabilir. Ancak her durum için kullanılması önerilen akışlar vardır. Uygulama türüne göre Web sitesi, mobil uygulama veya javascript uygulamaları için önerilen akışlar vardır. Örneğin native(mobil) ve javascript uygulamaları için implicit flow önerilir.

Authorization Code

Sunucu tabanlı çalışan uygulamalar için yetki verme işlemi Authorization Code tekniği ile gerçekleştirilir. Yani uygulama sunucusu (Client Application Server) ile veri kaynağının bulunduğu sunucu (Reource Server) arasında bir kimlik kontrolü gerçekleştirilir. Bu dolaşımda, Resource Owner tarafında kimlik bilgileri dolaşmaz. Authorization Code yetkilendirmesi Confidential Client türündeki uygulamalarda kullanılır.

authorization-auth-code

  1. Resource Owner(kullanıcı) korunmuş bir kaynağa erişmek üzere uygulamayı(Client Application) açar.
  2. Uygulama kullanıcıya giriş yapması gerektiğini bildiren bir sayfaya yönlendirir. Bu sayfada giriş yapmak için Authorization Server seçenekleri bulunur. Örneğin Facebook, Gmail, Twitter gibi.
  3. Bir seçeneği tercih eden kullanıcı giriş yapabilmesi için Authorization Server üzerinde bulunan login sayfasına yönlendirir. Örneğin Facebook, Gmail, Twitter giriş sayfası. Uygulama sunucusu arka planda Authorization Server tarafına Client ID bilgisini de gönderdiğinden dolayı Authorizaiton Server uygulamayı tanır.
  4. Authorization Server sayfasından kullanıcı bilgileri girilerek login işlemi gerçekleştirilir. Örneğin Twitter ile login işlemi gerçekleştirilir. Login işlemi başarılı bir şekilde gerçekleştirildikten sonra uygulamanın Twitter hesabı ile yetki almasını kabul edip etmediği sorulur. Hatta profil bilgileri, resim bilgileri kullanılsın mı şeklinde işaretlenebilir kutucuklar halinde kullanıcıya seçenekler sunulur. Kullanıcı kabul ederse Client Application’a yönlendirilir.
  5. Client Applicaiton sayfasına yönlendirildiğinde Authorization Server üzerine önceden kaydedilmiş olan Redirect URI adresine yönlendirilir. Yönlendirme ile birlikte Authorization Server tarafından yetkilendirmeyi temsil eden bir doğrulama kodu gönderir.
  6. Redirect URI yönlendirmesi sonrasında Client Application doğrudan Authorization Server ile bağlantı kurar ve doğrulama kodu(authorization code) ile birlikte Client ID ve Client Secret bilgisini gönderir.
  7. Eğer Authorization Server bilgilerin doğruluğunu kabul ederse geriye bir access token gönderir.
  8. Kullanıcı login olduğunu görüntüleyen bir sayfaya yönlendirilir.
  9. Korunmuş bir veri kaynağına erişim talebi yapılır.
  10. CLient Applicaiton daha önce elde ettiği access token ile birlikte Resource Server üzerindeki kaynağı talep eder. Bu kez Resource Server access token doğrulamasını yapmak için Authorization Server ile bağlantı kurar. Token geçerliliği doğrulanırsa kaynaktaki veri uygulamaya gönderilir.

Implicit Grant

Implicit yetkilendirme Authorization Code yetkilendirmeye benzer adımlara sahiptir. Ancak Authorization Code ile yetkilendirme sırasında yetkilendirme kodu sunucu ile Authorization Server arasında dolaşırken Implicit yetkilendirmede yetkilendirmeyi temsil eden access token vardır ve bu access token User Agent(internet tarayıcı) ile Authorization Server arasında dolaşır. Yani yetkilendirme kodu olan access token açık bir ortamda dolaşmaktadır. Bu nedenle Imlicit yetkilendirmeler Public Client türündeki uygulamalarda kullanılır. Örneğin javascript uygulamaları gibi.

Client Application yetkilendirme sırasında sadece Client ID bilgisini Authorization Server’a gönderir. Client Secret bilgisini göndermez. Aksi taktirde bu bilgiler üçüncü şahısların eline geçebilir.

authorization-implicit

Resource Owner Password Credentials

Access token elde etmek için kullanıcı adı ve şifre gibi bilgilerinin doğrudan gönderilerek yetki alma işlemi sırasında kullanılır. Bu yöntem Resource Owner ile Client arasında çok güvenilir bir ortam olduğunda tercih edilmelidir. Aksi taktirde güvenlik riskleri çok yüksek olacaktır.

Client Credentials

Client Credentials yetkilendirme türü kullanılırken uygulama(Client Application) kendine ait kimlik bilgilerini (Client ID ve Client Secret) Authorization Server’a göndererek access token bilgisini elde eder.

Bu tür yetkilendirmeler kullanıcı bilgilerini gerektirmeyen makineler arası haberleşme(machine-to-machine) gibi uygulamalarda tercih edilebilir. Bir makinenin yerine getireceği görevleri bir API üzerinden okuması veya yazması buna örnek olabilir. Ya da kullanıcı iznini gerektirmeyen kaynak kullanımlarında tercih edilebilir.

Client Credentials yetkilendirmesi sadece Client ID ve Client Secret bilgilerini gerekli kılarken, Resource Owner Password Credentials yetkilendirmesi doğrudan kullanıcının şifresini istemektedir.

OAuth 2.0 Protokolündeki Client Türleri

8 Ağu

OAuth 2.0 protokolü ile ilgili bir önceki yazıda OAuth 2.0 rollerini incelemiştik. Bu rollerden Application Client rölü, veri kaynağına erişmek amacıyla yetkilendirilen bir uygulamadır. Bu uygulama OAuth için kısaca Client şeklinde de adlandırılabilir. Veri kaynağına erişmek isteyen uygulamalar Mobil, Web Site, Jvascript/SPA (Single Page Applicaiton) veya Desktop şeklinde bir birinden farklı yapıda olabilmektedir. Altyapı ve işleyiş açısından farklılık arz eden bu uygulamalar için OAuth 2.0 protokolünde özel türler ve profiller belirlenmiştir.

Client Types (Client Türleri)

OAuth 2.0 protokolü için iki tür client tanımlanmıştır.

  1. Confidential (Gizli)
  2. Public (Açık)


Confidential Client kendi kimlik gizliliğini muhafaza edebilen yapıdaki uygulamalardır. Uygulama güvenli bir sunucu üzerinde barındırılır. Kimlik bilgileri Authorization Server tarafından önceden alınır ve uygulamaya kaydedilir verilir. Buna örnek olarak bir web site uygulamasını verebiliriz. Sunucuya yönetici haricinde kimse erişip client şifrelerine ulaşamaz.

Public Client kendi kimlik bilgilerini üzerinde güvenli bir şekilde muhafaza edemeyen uygulamalardır. Örneğin mobil, desktop uygulamaları üzerinde şifrelerin tutulması sakıncalıdır. Uygulamanın kodları bir şekilde kırıldığında kimlik bilgileriniz dolandırıcıların eline geçebilir. Benzer şekilde Javascript uygulamalarında kimlik bilgilerinin tutulması, tarayıcıda kaynağın görüntülenmesiyle ulaşılabilir olduğundan dolayı sakıncalıdır.

Client Profiles (Client Profilleri)

Client uygulamalar için OAuh 2.0 protokolünde üç farklı profili belirlenmiştir.

  1. Web Applicaiton
  2. User Agent
  3. Native

Bu profil bilgileri uygulama altyapısına göre belirlenmiş olup platform bağımsızdır.

Web Application

Web Application profiline sahip uygulamalar sunucu üzerinde çalışan uygulamalardır. Bu tür uygulamalarda sunucu(server) ve istemci(client) şeklinde iki taraf vardır. Sunucu, web sayfasını oluşturan(render eden) taraftır. İstemci ise internet tarayıcısında web sayfasını görüntüleyen taraftır. Örneğin asp.net web forms, asp.net mvc uygulaması veya java jsf uygulaması gibi uygulamalardır.

overview-client-types-1

Bu tür uygulamalar Confidential Client uygulama türündedir. Web Application profilindeki uygulamaların sunucu tarafı admin yetkisinde bulunduğundan bu kısıma üçüncü şahısların dışarıdan erişmesi söz konusu değildir. Eğer bir Web Application üzerinden bir Reource Server’a erişmek isteniyorsa uygulamaya(client) ait kimli bilgileri (id, şifre gibi) sunucu üzerinde tutulur. Böylece kimlik bilgileri gizlenmiş olur.

User Agent

User Agent profilindeki uygulamalar tamamen internet tarayıcısı üzerinde çalışan uygulamalarıdır. User Agent uygulamaları da Web uygulamaları gibi sunucu üzerinde barındırılır. Ancak uygulama, internet tarayıcısına bir kez indirilir ve indirildikten sonra tarayıcı üzerinde çalışmaya başlar. Kaynak (Resource Server) üzerinden ihtiyaç duyulan veriler http, https veya ws gibi protokoller üzerinden talep edilir.

Günümüzde User Agent uygulamalarına en iyi örnek javascript uygulamalarıdır. Bir kaç yıl öncesine kadar Java Flex, Microsoft Silverlight ve Adobe Flash uygulamlar da User Agent açısından önemli bir yere sahipti. Fakat bu tür uygulamaların çalışması için platform bağımlılığını gerektiren bir takım ek yazılımlar gerektiğinden ve mobil cihazlarda uyum sorunu ortaya çıktığından dolayı artık bunların yerine Javascript tercih edilmektedir.

overview-client-types-2

Bu tür uygulamalar Public Client uygulama türündedir. User Agent profilindeki uygulamaların kaynağı internet tarayıcısından görüntülenebildiği için bu uygulamalar üzerinde kullanıcı adı veya şifre gibi kimlik bilgileri muhafaza edilmez.

Native

Native profilindeki uygulamalar, kişisel bilgisayarlar ve mobil cihazlar üzerinde çalışan uygulamalardır. Örneğin Desktop, Android, iOS, Windows Mobile gibi uygulamalar Native profilli uygulamalardır. Bu tür uygulamalar doğrudan cihazlara yüklenerek çalışırlar.

overview-client-types-3

Native uygulamalar Public Client uygulama türündedir. Kişisel cihazlara erişim açık olduğundan dolayı uygulamaların kodlarının kırılması durumunda uygulama kimlik bilgilerine erişmek mümkündür.

OAuth 2.0 Protokolünde Roller

7 Ağu

Bir önceki yazıda OAuth 2.0 protokolünü gelen bakış şeklinde incelemiştik. Bu yazıda OAuth 2.0 protokolüne ait rolleri incelemeye çalışacağız. Protokolde dört farklı rol bulunmaktadır. Bunlar:

Roller aslında protokol dahilinde birbirleri ile haberleşecek olan taraflardır diyebiliriz. Bu taraflar kişi veya uygulamalar olabilir. Yani her bir rolün fiziki veya mantıksal bir karşılığı vardır. Rollerin bu bağlamda topolojik olarak dizilimi aşağıdaki şekilde gösterilmiştir.

overview-roles
Resim Kanak: http://tutorials.jenkov.com/images/oauth2/overview-roles.png

Grafikte ifade edildiği üzere Resource Owner sadece Client Application ile iletişim kurmaktadır. Client Application ise yetki almak için Authorization Server ile, aldığı yetki neticesinde kaynağa erişmek için Resource Server ile iletişim kurmaktadır. Yine grafikte görüldüğü üzere Resource Server ile Authorization Server arasında bir iletişim söz konusudur. Bu iletişim Client Application access token ile Resource Server  tarafına her talepte bulunduğunda access token doğrulamasının yapılması için gerçekleştirilir.

Resource Owner

Reource Owner, verinin sahibi olan kişi veya uygulamadır. Örneğin Facebook veya Instagram kullanıcıları sistemdeki verilerin gerçek sahipleri olduklarından birer Resource Owner’dır. Sunucuların birbirleri ile veri alış verişi yaptığı durumlarda ise Resource Owner bir insan yerine bir uygulama olmaktadır.

Resource Server

Mahrem verinin tutulduğu sunuculardır. Yani veri kaynağı sunucusudur. Örneğin Twitter uygulamasının tweet akışı için yayın yaptığı sunucular birer Resource Server’dır. Her önüne gelen size ait özel bilgileri buradan okuyamaz.

Client Application

Resource Server üzerindeki verilere erişmek üzere talepte bulunan uygulamalara Client Application denir. Örneğin kişisel blog sayfanızda Flickr üzerindeki resimlerinizi yayınlamak istiyorsanız blog sayfanız Flickr uygulaması için Client Application olacaktır. Bu durumda Resource Owner da siz olursunuz.

Authorization Server

Veri kaynağına (Resource Server) ulaşmak isteyen istemci uygulamaları(Client Applications) yetkilendirir. Authorization Server ve Resource Server aynı sunucu üzerinde veya farklı sunucular üzerinde olabilir. Farklı sunucular üzerinde bulunması iletişim açısından teknik olarak bir sorun teşkil etmez.

Bir istemci uygulamanın Authorization Server tarafından yetkilendirilebilmesi için istemci uygulamaya ait adres bilgileri Authorization Server tarafına kaydedilmelidir. Yani Authorization Server, hangi uygulamayı tanıyıp yetkilendireceğini bilmelidir.

OAuth 2.0

5 Ağu

OAuth 2.0 protokolüne genel bir bakış niteliğinde olan bu yazıda uygulama detaylarına girmeden protokolün işleyişi ve karakteristiği incelenmektir. Uygulamalı örnekleri belki daha sonraki yazılarda paylaşma imkanı olabilir.

OAuth protokolü Web , Mobil ve Masaüstü uygulamalarına basit ve standart bir yöntemle uygulamalara güvenli yetkilendirme imkanı sunan açık bir protokoldür. OAuth sayesinde erişim izni sınırlı olan verilerin yani korunmuş verilerin güvenli bir şekilde hizmete sunulması basitleştirilmiştir.

OAuth 2.0 protokolü, OAuth 1.0 üzerinde geliştiricilere yönelik kolaylıklar sağlamak amacıyla yapılan bir dizi düzenlemeler sonrası 2006 yılında ortaya çıkan versiyondur.

OAuth 2.0 uygulamaların birbirleri arasında veri erişimine olanak sağlayan açık bir yetkilendirme protokolüdür. Burada vurgulamak isterim ki OAuth, kullanıcı doğrulama amaçlı değil uygulama yetkilendirme amaçlı bir protokoldür. Bir uygulamanın başka bir uygulama tarafından doğrulanmış kullanıcılara izin vermesidir. Örneğin stackoverflow uygulamasın giren ziyaretçilerin sisteme erişebilmeleri için kişisel Facebook hesapları ile giriş yapanlarına izin verilmektedir.

Günümüzde sosyal medya uygulamalarının bir çoğu (Facebook, Google, Twitter v.s) OAuth 2.0 protokolünü desteklemektedir. Örneğin bir web sitesinin Login seçenekleri arasında Facebook veya Google hesabı ile kullanıcılarına Login seçeneği sunuyor olması bu uygulamaların kullanıcı doğrulama ve uygulama yetkilendirme işlemini OAuth protokolünü kullanarak gerçekleştirmesi sayesinde mümkün olmaktadır.

bootstrap-login

OAuth bir istemci veya sunucu kütüphanesi değildir. Sadece uygulamalar arasında yetkilendirme amacıyla oluşturulmuş bir protokolüdür. Ancak OAuth standardına uygun olacak şekilde çeşitli platformlarda (PHP, Java, .Net, Python, Nodejs, v.s) geliştirilmiş sunucu ve istemci kütüphaneleri mevcuttur. İlgili kütüphanelere buradan erişmek mümkündür.

file-POvDVUfM8H

Bu kütüphaneler sayesinde gerçekleştirilebilecek iki tür uygulama vardır.

  • Birincisi sunucu tarafında oluşturulan bir yetkilendirme uygulaması. Bu uygulama sayesinde siz de bir doğrulama ve yetkilendirme sunucusu oluşturabilirsiniz. Başka uygulamalar da sizin bu uygulamanızı kullanarak tıpkı Facebook ve Google gibi sizin uygulamanız ile yetkilendirme yapabilirler.
  • İkincisi OAuth 2.0 protokolüne uygun bir istemci uygulaması. Bu uygulama ile OAuth 2.0 destekli bir sunucu uygulamasında bulunan kaynağa erişebilirsiniz.

OAurh 2.0 Teknolojisinde Roller

OAuth 2.0 protokolü dahilinde birbirleri ile iletişim kuran taraflar şu şekildedir.

  1. Resource owner
  2. Client Application
  3. Authorization Server
  4. Resource Server

Resource Owner: Bir sistemde bulunan veriye sahip olan kişi veya uygulamadır. Örneğin Twitter uygulamasında hesabınıza girerek paylaştığınız tweet, resim veya videolar size ait birer veridir ve burada Resource Owner siz olursunuz.

Client Application: Resource Owner’ın sahip olduğu verilere erişen uygulamadır.  Eğer kişisel blog sayfanızda size ait tweet’leri paylaşmak istiyorsanız blog sayfanızın Resource Server’a yani Twitter sunucularına erişmeniz gerekir. Bu durumda Client, sizin kişisel blog sayfanız olur.

Authorization Server: Client Application olarak belirlenen uygulamalara yetki veren sunuculardır. Size ait Tweet’leri kişisel blog sayfanıza çekmek istediğinizde Twitter sunucularının sizin blog sayfasını tanıması gerekmektedir. Bu durumda önce sayfanızın adres bilgilerini Twitter sunucularına kaydetmeniz gerekmektedir. Ardından sizin sayfanızdan Twitter sunucularına bir talep gittiğinde uygulamanız yetkilendirilecektir. Bu doğrulamayı ve yetkilendirmeyi yapan Twitter sunucuları OAuth 2.0 protokolündeki Application Server’dır.

Resource Server: Erişilmek istenen korunmuş verilerin bulunduğu yerdir. Örneğin kişisel blog sayfanızda yayınlamak üzere erişmek istediğiniz Tweet’leri sunan Api uçları (endpoints) Reource olarak adlandırılır.

OAuth 2.0 Dolaşım Sistemi (Flows)

OAuth 2.0 protokolünde kullanıcının(client) gerekli olan veriye erişmek amacıyla izlediği yola flow denir. Örneğin access_token veya id_token bilgilerine erişmek bir flow süreci kapsamında gerçekleştirilir. Flow sürecinde, taraflar arasında gerçekleşen dolaşım sistemi (flows) genel olarak şu şekildedir:

slack_oauth_flow_diagram@2x
Resim Kaynağı: https://api.slack.com/docs/oauth

Dolaşım sisteminin başlangıç noktası Resource Owner yani kaynak sahibidir. Reource Owner, yetkilendirme akışını Client Application üzerinden başlatır. Yetki verme (Authorizetion Grant) isteği uygulama üzerinden Authorization Server tarafına aktarılır. Kullanıcı doğrulandığında Client Application tarafına kaynağa erişmek amacıyla bir Access Token gönderilir. Artık Access Token ile Resource Server üzerindeki bilgilere erişmek mümkün hale gelmiştir.

OAuth 2.0 Genel Kavramları

OAuth 2.0 bünyesinde ele alınacak olan genel kavramlar genel başlıklar halinde şöyledir:

  1. OAuth 2.0 Roles
  2. OAuth 2.0 Client Types
  3. OAuth 2.0 Authorization Flows
  4. OAuth 2.0 Authorization Endpoints

OAuth 2.0 protokolü ile ilgili detaylı bilgilere buradan ulaşmak mümkündür.

JSON Web Token – JWT

19 Haz

JSON Web Token OAuth protokolü üzerinde veri değiş tokuşu sırasında kullanılan JSON formatında veriler içeren veri yapılarıdır.

JSON Web Token, Web içerik kaynağına erişmek için kullanılan bir bilet gibi düşünülebilir. Erişilmek istenen Web kaynağı, bir servis veya web sitesi olabilir. Kaynağa erişmek isteyen kullanıcı uygulamanın, doğrulanmış ve yetkili olup olmadığını tanıtan bir kart gibi düşünebiliriz. Genel olarak access token olarak da adlandırılır.

Token Kullanım Amacı

JSON Web Token kullanım amacı güvenliği sağlamaktır. Web Api gibi kaynaklara erişim talepleri mobil, SPA (Single Page Application)  veya Web sitesi gibi uygulamalardan yapılabilmektedir. Sınırlı erişime sahip yada kullanıcı doğrulama gerektiren Web Api kaynağına yapılan her talep(request) bünyesinde bir erişim bileti(access token) bulundurmak zorundadır.

  • Güvenlik amacıyla kullanılan veri yapılarıdır.
    • İçeriğinde issuer ve subject (claims) bilgileri bulunur.
    • Simetrik veya asimetrik imzalar içerir.
    • Kullanım bitiş süresi(expiration time) içerir.
  • Kullanıcı(Client) uygulama, token talebini yapan taraftır.
  • Yayıncı(issuer), kullanıcıya token veren taraftır.
  • Kaynak(resource) token bilgisini kullanan taraftır.
    • Yayıncı(issuer) ile güvenli bir iletişim içerisindedir.

Token Yapısı

encoded-jwt3

Access token şifrelenmiş ve nokta(.) ile ayrılmış üç bölümden oluşur ve her bir bölüm, kendine has bilgiler barındırır. Bunlar:

  1. Header
  2. Payload
  3. Signature şeklindedir

Bir token içeriğinde bulunan bilgiler şifre çözülerek edilerek elde edilebilir. Online olarak bu işlemi gerçekleştirmek için jwt.io kullanılabilir.

legacy-app-auth-5

Bir JWT kendisi ile ilgili bilgileri bünyesindeki ilgili bölümde barındırır.

JWT Header Bölümü: İki kısımdan oluşur

  • Tür bilgisi (Örnek: JWT)
  • Şifreleme algoritma bilgisi (Örnek: HMAC, SHA256)

JWT Payload Bölümü: Bu bölümde uygulamalar için gerekli bilgiler bulunur. JWT Claims olarak da adlandırılır. JWT Claims üç farklı bölüme ayrılmıştır.

1- Registered Claims: Bu bölümde bulunabilecek içerik bilgisi aşağıdaki gibi olmakla beraber hepsinin kullanılması zorunlu değildir.

  • iss“(issuer): Token üreten yayıncı.
  • sub“(subject): Token başlığı.
  • aud“(audience): Token alıcısı.
  • exp“(expiration time): Token bitiş süresi.
  • nbf“(not before): Belirtilen tarihten önce kullanılamaması.
  • iat“(issued at): Token yayınlanma zamanı.
  • jti“(JWT ID): Unique identifier.

2-Public Claims: Bu bölümde tanımlanan bilgilere URI veya URN şeklinde adlandırma yapılarak token gönderen ve alan tarafların aynı ağda olmadığı durumlarda namespace belirteci ile çarpışmalar önlenebilir. Örneğin: https://www.bayramucuncu.com/jwt_claims/is_admin

3-Private Claims: Genelde kurumsal özel ağlarda kullanılan ve token üretici ve tüketicisi arasında kullanılan özel isimlerdir.


{
    "iss": "bayramucuncu.com", //Registered Claim
    "exp": 123456789, //Registered Claim
    "https://bayramucuncu.com/jwt_claims/is_admin": true, // Public Claim
    "username": "bayram", // Private Claim
    "user_id": "7617dfa9-9084-4e1e-8140-e1dc161ac594" // Private Claim
} 

JWT Signature Bölümü:

Bu bölüm JWT için imza niteliğindedir ve üç bölümün şifrelenmiş olarak birleştirilmesinden oluşur.

  1. JWT Header
  2. JWT Payload
  3. Secret

Örneğin HMAC SHA256 algoritması ile şifreleme yapmak için aşağıdaki yol izlenebilir.

  HMACSHA256(
    base64UrlEncode(header) + "." + base64UrlEncode(payload),
    secret
  )

Token imza bölümü gönderenin kim olduğu bilgisini içerir ve bilginin yolda gelirken değiştirilmediğini garanti altına alır.

Token elde etme süreci nasıl işler?

jwt-diagram

Adım-1: İstemci (client)tarafından JWT üreten sunucuya kullanıcı adı ve şifre ile birlikte POST talebi gönderilir.

Adım-2: Eğer kullanıcı bilgileri doğru ise sunucu istemciye bir JWT gönderir. 

Adım-3: Elde edilen JWT bilgisi ile artık istenen kaynaktan veri elde etmek mümkündür. Kullanıcı tarafı, yeni bir talep gönderirken JWT bilgisini talebin HTTP header bölümüne ekler ve talebi kaynağa iletir.

Adım-4: Sunucu JWT kontrolü sonrasında istemciye cevabı geri gönderir.

JWT Kullanmanın Avantajları

  • Kaynak tarafında oturum yönetimi(session management) yoktur.
  • Cookie kulanımına gerek yoktur.
  • Kaynaklar farklı domainlerde olsa bile tek bir token ile birden fazla kaynağa ulaşmak mümkündür. Çünkü JWT üreten sunucu diğer sunuculardan tamamen bağımsızdır ve her kaynak JWT doğrulamasını JWT üreten sunucudan yapar.
  • Mobil uyumludur. iOS, Android, Windows Mobile gibi ortamlarda token kullanarak kaynağa erişim sağlamak mümkündür.
  • Her token kendi bitiş süresine sahiptir ve logout gibi işlemlere gerek yoktur. Süresi bitmiş bir Token ile kaynağa erişim mümkün değildir.
  • Performansı yüksektir.
  • RFC tarafından standartlaştırılmıştır. Standart kodu RFC 7519‘dur.

Kaynaklar:

  • https://jwt.io/introduction/
  • https://jwt.io/
  • https://tools.ietf.org/html/rfc7797
  • http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#RegisteredClaimName
  • https://auth0.com/blog/2014/12/02/using-json-web-tokens-as-api-keys/