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.

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/