OAuth2 Basit Anlatım

oauth2-flow

OAuth2 yetkilendirme işlemleri için kullanılan standartlaşmış bir protokoldür. OAuth2 versiyonu 2006 yılında ortaya çıkmış olan orijinal OAuth protokolünün yerine geçmiştir.

OAuth2 kullanarak kullanıcıdan, hesabının tamamına ya da belli bir kısmına erişmek için yetki alıp bunu kendi uygulamanızda kullanabilirsiniz. Bunun ön yaygın örnekleri Facebook, Twitter, Google hesabınız ile başka uygulamalara ya da web sitelerine giriş yapabilmenizdir.

oauth2-flow

OAuth 2 Protokol Akışı

  1. Uygulama kullanıcıdan hesabının tamamına ya da bir kısmına erişebilmek için izin ister.
  2. Eğer kullanıcı bu isteği onaylarda uygulama bir yetki izni (authorization grant) elde eder.
  3. Uygulama yetkilendirme (authorization) sunucusuna kendi bilgilerini ve almış olduğu yetki iznini (authorization grant) göndererek sunucudan access token isteğinde bulunur
  4. Eğer uygulama bilgileri doğruysa ve yetki izni (authorization grant) geçerli ise, yetkilendirme (authorization) sunucusu uygulamaya bir access token sağlar.
  5. Uygulama almış olduğu access token ile birlikte içerik (resource) sunucusuna erişmek istediği içerikle ilgili istek gönderir.
  6. Eğer uygulamanın göndermiş olduğu access token geçerli ise, içerik (resource) sunucusu, ilgili içeriği uygulamaya geri gönderir.

 

Yetkilendirme sürecini anlayabilmemiz için bazı terimleri bilmemiz gerekiyor. Bunları aşağıda basit bir şekilde sıraladım.

Client (Uygulama)

Client kullanıcının hesabına erişmeye çalışan uygulamadır. Hesaba erişebilmek için kullanıcıdan izin alması gerekir.

Resource Server/API (İçerik Sunucusu)

Resource Server (İçerik Sunucusu) kullanıcının bilgilerine erişmek için kullanılan API sunucusudur.

Authorization Server (Yetkilendirme Sunucusu)

Kullanıcının isteği onayladığı ya da reddettiği arayüzü sağlayan sunucudur. Küçük çaplı uygulamalarda bu API sunucusu ile aynı sunucu olabilir fakat büyük ölçekli uygulamalarda genellikle ayrı bir bileşen olarak oluşturulur.

Resource Owner (Kullanıcı)

Resource owner hesabının belli kısımlarına erişmenize izin veren kullanıcıdır.

 

Uygulama Kaydı

Yetkilendirme işlemi yapabilmemiz için önce uygulamamızı kayıt ettirmemiz gerekir. Yetkilendirme (authorization) sunucusu sadece önceden kayıt edilmiş uygulamalardan gelen isteklere cevap verecektir. Uygulamamızı kayıt ederken uygulama ismi, açıklaması, logosu gibi bilgileri gireriz, bunlar opsiyoneldir. Fakat her uygulamada bulunması gereken bilgiler vardır. Bunlar; Redirect (Yönlendirme) URI, Client ID ve Client Secret.

 

Redirect (Yönlendirme) URIı

Yetkilendirme (authorization) sunucusu, kullanıcıyı, kullanıcının izin verme işleminden sonra yalnızca uygulamanın sistemde kayıtlı yönlendirme adresine yönlendirir.

Client ID

Uygulama sisteme kayıt edildikten sonra, sunucunun her uygulama için özel olarak vermiş olduğu ID değeridir. Client ID yetkilendirme (authorization) sunucusunun uygulamayı tanımlayabilmesi için kullanılır. Client ID ayrıca kullanıcıdan izin almak için kullanılacak URL oluşturmak için de kullanılır.

Client Secret

Uygulama sisteme kayıt edildikten sonra, sunucunun her uygulama için özel olarak vermiş olduğu secret değeridir. Bu secret değeri gizli tutulmalıdır.

Yetkilendirme (Authorization)

Yukarıda da belirttiğimiz üzere OAuth 2 işleminin ilk adımı kullanıcıdan yetki almaktır. OAuth 2 ile kullanabileceğiniz birkaç izin tipi (grant type) bulunur. Bu izin tipleri aşağıda listelenmiştir

  • Authorization Code: Server tabanlı çalışan uygulamalar tarafından kullanılır.
  • Password: Güvenilir uygulamalar (trusted clients) tarafından kullanılır. Güvenilen uygulamalar servisin kendi uygulamalarıdır. Örneğin facebook mobil uygulaması için password izin tipini kullanır çünkü izin alacağı kullanıcı zaten kendi kullanıcısıdır ve kullanıcının bu uygulamaya şifresini girmekte bir mahsur yoktur.
  • Client Credentials: Uygulama API erişimi için kullanılır.
  • Implicit: Eskiden client secret olmaksızın, mobil uygulamalar ve server tabanlı olmayan, tarayıcıda çalışan web uygulamaları (örneğin JavaScript ile geliştirilmiş bir web uygulaması) için kullanılırdı, fakat şimdi client secret siz Authorization Code izin tipi ile kullanılması öneriliyor. Yani Implicit izin tipinin kullanılması önerilmiyor.

Grant Type: Authorization Code Örnek Akış

Adım 1: Authorization Code Linki

Önce kullanıcıya yetki verebilmesi için bir link oluşturalım.

https://api.orneksite.com/oauth/authorize?responsetype=code&client_id=CLIENT_ID&redirect_uri=REDIRECT_URL&scope=read

Yukarıdaki link ne anlama geliyor onu açıklayalım

  • https://api.orneksite.com/oauth/authorize: APIımızın yetkilendirme linki
  • responsetype=code: uygulamamızın bir authorization code istediğini belirtir.
  • client_id=CLIENT_ID: isteği yapan uygulamanın Client IDsi
  • redirect_uri=REDIRECT_URL: kullanıcıdan izni alıp, authorization code elde edildikten sonra servisin kullanıcıyı yönlendireceği adres
  • scope=read: uygulamanın hangi yetkileri istediğini belirtir.

 

Adım 2: Kullanıcının Uygulamaya İzin Vermesi

Kullanıcı yukarıdaki linki tıkladıktan sonra, servis tarafından uygulamaya izin vermesi karşısına bir arayüz çıkartılır

oauth2-authorization-code-flow

Adım 3: Uygulama Authorization Code Elde Eder

Eğer kullanıcı Kabul et butonuna tıklarsa, servis kullanıcı uygulamanın sistemde kayıtlı yönlendirme adresine yönlendirir.

https://ornekuygulama.com/yonlendir?code=AUTHORIZATION_COE

Adım 4: Uygulama Access Token İsteğinde bulunur

Uygulama access token almak için servise uygulama detaylarıyla beraber bir POST isteği gönderir

https://api.orneksite.com/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URL

Adım 5: Uygulama Acces Token Elde Eder

Eğer uygulamanın gönderdiği bilgiler geçerli ise, servis uygulamaya bir access token gönderir.

[sourcecode]

{

"access_token":"RsT5OjbzRn430zqMLgV3Ia",

"expires_in":3600

}

[/sourcecode]

Eğer uygulamanın gönderdiği bilgiler geçerli değilse, servis uygulamaya hata mesajı gönderir.

[sourcecode]

{

"error":"invalid_request"

}

[/sourcecode]

Grant Type: Password Örnek Akış

Kullanıcı bilgilerini uygulamaya girdikten sonra, uygulama bu bilgileri kullanarak servise POST isteği gönderir. Eğer bilgiler geçerli ise servis uygulamaya access token gönderir.

https://api.orneksite.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID

 

Grant Type: Client Credentials Örnek Akış

Uygulama kendi Client ID ve Client Secret bilgilerini POST metodu ile servise gönderir. Eğer bu bilgiler geçerli ise servis uygulamaya bir access token gönderir

https://api.orneksite.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

 

Yetkilendirilmiş İstek Yapmak

Uygulama access token elde ettikten sora, bu tokeni kullanarak kullanıcının adına istekte bulunabilir. Curl kullanarak aşağıdaki gibi bir istek yapabilirsiniz

curl -G “Authorization: Bearer ACCES_TOKEN” \ “https://api.orneksite.com/1/profile”

 

Bir sonraki yazıda görüşmek üzere.

Comments

  1. Ayşe Sayarı

    Merhabalar, örneklendirmeleriniz ve makaleniz için çok teşekkür ederiz. Gerçekten çok makbule geçti ve fayda gördüm. Yalnız bir konuda size danışmam gerekti. Yetkilendirmeleri yaparken metod başına [Autorized] özniteliğini yerleştiriyoruz.

    Ben asp.net mvc de simple membership kullanmıyorum ve kendi üyelik sistemim var. Metodun başına koyduğumuz [Autorized] özniteliği membership için mi yoksa OAuth 2.0 nin bir parçası mı, açıkçası tereddütte kaldım.

    Bu konuda bir fikriniz var mıdır ? Hazır membership kullanmıyorsak, OAuth 2.0 yi implement edebiliyor muyuz projemize ?

    Teşekkürlerimi sunarım.

    Ayşe

    1. Post
      Author
      Furkan Begen

      Merhaba,
      Kendi üyelik sisteminizi kullanıyorsanız da OAuth 2.0 yi implement edebilirsiniz yalnız .net taradında bunu nasıl yapabilirsiniz bilmiyorum. Müsait bir zamanımda Java ile OAuth 2.0 implementasyonu konusunda bir makale yazacağım. Örnek projede kullandığım veri tabanı yapısını fikir vermesi amacıyla inceleyebilirsiniz.
      OAuth 2.0 veritabanı

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir