Ubuntu server üzerine RabbitMQ kurulumu

24 Ağu

RabbitMQ dağıtık uygulamaların (distributed application) oluşturulmasında ihtiyaç duyulan mesajlaşma kuyruğunu yöneten bir uygulamadır. Uygulamanın görevi günlük hayatımızda dolmuş ve otobüs duraklarına gelen müşterileri araçlara yönlendiren görevlilere(simsarlara) benzetildiğinden kısaca message broker(mesaj simsarı) olarak adlandırılmıştır.

RabbitMQ resmi sayfasında ürün özelliklerinden kısaca şu şekilde bahsedilmektedir.

  • Robust messaging for applications: Uygulamalarınız için sağlam bir mesajlaşma altyapısı.
  • Easy to use: Kullanımı kolay.
  • Runs all major operating systems: Yaygın kullanılan işletim sistemlerinin hepsinde çalışır.
  • Supports a huge number of developer platforms: Çok sayıda yazılım geliştirici platformunu destekler.
  • Open source and commercially supported: Açık kaynak ve ticari lisanslı seçenekleri destekler.

RabbitMQ uygulaması Erlang programlama dili ile geliştirilmiştir. Bu nedenle kurulum yapılacak olan sistemlerde öncelikle Erlang kodlarını çalıştırabilen altyapının kurulması gerekmektedir.

RabbitMQ Ubuntu Kurulumu

Ubuntu üzerinde kurulum gerçekleştirmek için apt komutu kullanılabilir. (Ubuntu 14.04 veya sonrası sürümlerde).

Öncelikle Ubuntu repository paket listelerini güncelleyerek en son paketlerin listesini elde ederek başlayabilirsiniz.

sudo apt-get update

Ardından RabbitMQ paketini indirerek kurulumu gerçekleştirebilirsiniz.

sudo apt-get install rabbitmq-server

RabbitMQ sürümünü öğrenmek için kullanılacak olan komut:

sudo rabbitmqctl status

Bu komut çalıştırıldığında gelen listede versiyon numarası bulunur.

{rabbit, “RabbitMQ”, 2.7.1}

Kurulum işlemi gerçekleştirildikten sonra RabbitMQ servisinin çalışır duruma getirildiğini görebilirsiniz.

sudo service –status-all

RabbitMQ mesajlarını görüntüleyebilmek için bir plugin geliştirilmiştir. Bu plugin sayesinde web arayüzü üzerinden mesajlaşma trafiğini izleyebilirsiniz. Plugin adı rabbitmq_management şeklindedir. Bu plugin aktif edilmeden kullanılamaz. Aktif etmek için kullanılacak komut:

sudo /usr/lib/rabbitmq/lib/rabbitmq_server-2.7.1/sbin/rabbitmq-plugins enable rabbitmq_management

Plugin konfigürasyonu değiştiği için rabbitmq-server servisinin yeniden başlatılması gerekmektedir.

sudo service rabbitmq-server restart

Bu işlemi gerçekleştirdikten sonra aktif RabbitMQ plugin listesini görüntüleyebilirsiniz.

 sudo /usr/lib/rabbitmq/lib/rabbitmq_server-2.7.1/sbin/rabbitmq-plugins list

rabbitmq-management

Artık web arayüzü aktif edilmiştir. Web arayüzüne erişim için internet tarayıcınızdan:

http://sunucunuzun-ip-adresi:55672/

RabbitMQ 2.7.1 sürümünde web arayüzü varsayılan olarak 55672 portundan aktif edilmektedir.

rabbitmq-management-web

Güncelleme: RabbitMQ 3.6.5 sonrası sürümlerde 15672 portundan aktif edilmektedir.

.Net Framework Spatial Data Desteği

22 Ağu

System.Data altında bulunan sınıflar(Class) sayesinde farklı veri kaynaklarına erişmek ve onlar üzerinde işlemler yapmak mümkündür.  Örneğin ADO.NET mimarisinde kullanılan SQL Server, Oracle, ODBC ve OleDB gibi veri sağlayıcılar bu namespace altında bulunurlar.

.Net Framework 4.5 versiyonundan önce mekansal verilere düz SQL sorguları ile veya veritabanı üzerine kaydedilen stored procedure’ler aracılığı ile erişilebilmekteydi. Ancak .Net 4.5 versiyonundan sonra System.Data  kütüphanesine eklenen System.Data.Spatial alanı ile artık mekansal verilere erişim ve onlar üzerinde yapılacak işlemler DbGeography ve DbGeometry nesneleri ile gerçekleştirmek mümkün hale gelmiştir.

DbGeography

DbGeography sınıfı, verilerin jeodezik(yer yüzeyindeki)  koordinat sisteminde temsil edilmesini sağlar. Yani belirli bir koordinat sistemine göre nesnelerin yeryüzündeki konumu ile ilgilenir. Örneğin bir noktanın yeryüzünde nereye karşılık geldiği DbGeography nesnesi ile temsil edilebilir.

DbGeometry

DbGeometry sınıfı, nesnelerin geometrik şekillerini tanımlayan nesneler için bir taban oluşturur. DbGeometry nesnelerin konumu ile ilgilenmez, sadece şekilleri ile ilgilenir. Nesnelerin geometrik şekilleri Point, Polygon, LineString v.b. olabilmektedir. Örneğin bir yolun şeklinin LineString olması DbGeometry nesnesi ile temsil edilir. Yolun nerede konumlandığı ise DbGeography nesnesi ile temsil edilir.

Geometry ve Geography kavramlarının ayrımı sadece .Net platformuna özgü bir mesele değildir. Bütün platformlarda bu şekilde organize olmuştur. Bu organizasyon yazılım platformundan ziyade Coğrafi Bilgi Sistemleri ile alakalı bir durumdur.

DbGeometry ve DbGeography kavramlarını bir örnek üzerinden inceleyerek devam edelim. Open Geospatial Consortium (OGC) standartlarında bir geometrik şeklin temsili Well Known Text (WKT) adında bir işaretleme dili ile belirlenmiştir. Örneğin bir noktanın WKT gösterimi şu şekildedir:

POINT (12.321876 24.981276)

Örneğin Gebze’de seçilen bir noktanın Pendik ve İzmit’te seçilen noktalara göre uzaklıklarını karşılaştıralım.


[Test]
public void ClosestPoint_WithThreePoints()
{
    var gebze = DbGeometry.FromText("POINT(40.803099 29.405076)");
    var pendik = DbGeometry.FromText("POINT(40.877359 29.254845)");
    var izmit = DbGeometry.FromText("POINT(40.764946 29.950905)");

    var gebze_pendik = gebze.Distance(pendik);
    var gebze_izmit = gebze.Distance(izmit);

    Assert.True(gebze_izmit > gebze_pendik);
}

gebzepoint

Burada gebze.Distance(pendik) metodunun yaptığı iş aslında Pisagor‘un iki nokta arasındaki uzaklık hesabıdır. Yani düzlemdeki iki noktanın bir birine olan uzaklığının hesaplanması işlemi gerçekleştirilmekte ve sonuç derece cinsinden bir değer olmaktadır.

Geometrik şekilleri yer yüzündeki konumu ile temsil etmek için DbGeography sınıfı kullanılır.

[Test] 
public void ClosestLocation_WithThreePoints() 
{ 
    var gebze = DbGeography.FromText("POINT(40.803099 29.405076)", 4326);
    var pendik = DbGeography.FromText("POINT(40.877359 29.254845)", 4326); 
    var izmit = DbGeography.FromText("POINT(40.764946 29.950905)", 4326);

    var gebze_pendik = gebze.Distance(pendik);
    var gebze_izmit = gebze.Distance(izmit);

    Assert.True(gebze_izmit > gebze_pendik);
}

gebzepoint
Sonuç olarak metre cinsinden uzaklıklar elde edilir. Gebze’de seçilen nokta ile İzmit’te seçilen nokta arasındaki uzaklık yaklaşık 6km şeklinde hesaplanmıştır.

DbGeography sınıfında geometrik şekil tanımlama işlemi DbGeometry ile aynıdır. Ancak ek parametre olarak koordinat sistemi kodu (coordinateSystemId) girilebilir. Bu kodlar European Petroleum Survey Group(EPSG) tarafından koordinat sistemlerine atanmıştır. Bilinen tüm koordinat sistemlerine karşılık bir tamsayı vardır. Bu konu ile ilgili detaylara Spatial Reference System başlıklı yazıdan ulaşabilirsiniz.

 

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.