Yetkilendirme | GraphQL

Mehmet Ali Peker
Sorcial Development
2 min readDec 31, 2017

--

Yetkilendirme (authorization), belirli bir kullanıcının/oturumun/bağlamın (user/session/context) bir eylem gerçekleşmesine veya bir veriyi görmesine izin olup olmadığını açıklayan iş mantığının (business logic) türüdür. Örneğin:

“Sadece yazarlar taslaklarını görebilir”

Bu tür zorunluluk oluşturmak iş mantığı katmanında gerçekleşmelidir. Yetki mantığını GraphQL katmanına yerleştirmek caziptir:

var postType = new GraphQLObjectType({
name: ‘Post’,
fields: {
body: {
type: GraphQLString,
resolve: (post, args, context, { rootValue }) => {
// Kullanıcı gönderinin yazarıysa gönderinin içeriğini (body) döndür
if (context.user && (context.user.id === post.authorId)) {
return post.body;
}
return null;
}
}
}
});

Yazının authorId alanının geçerli kullanıcının id alanı ile eşleşip eşleşmediğini kontrol ederek “yazarın, yazı sahibi olduğu”nu tanımladığımıza dikkat edin. Sorunu bulabiliyor musunuz? Bu kontrolü her kontrol noktası için servis ile çoğaltmamız gerekecektir. Ayrıca, yetkilendirme mantığı korunmazsa kullanıcıların hangi API’yı kullandıklarına bağlı olarak farklı veriler görebilir. Yetkilendirme için tek bir doğru kaynağın olmasından kaçınıyoruz.

Çözümleyici (resolver) içinde yetkilendirme mantığını tanımlamak, GraphQL öğrenirken veya prototip oluşturmada iyidir. Ancak, production (Türkçe kelime önerisi olan yorumlarda belirtirse sevinirim :) ) kod tabanı için, yetkilendirme mantığı (authorization logic) iş mantığı (business logic) için temsilci. Bir örnek:

// Yetkilendirme mantığı postRepository içinde olur
var postRepository = require('postRepository');

var postType = new GraphQLObjectType({
name: ‘Post’,
fields: {
body: {
type: GraphQLString,
resolve: (post, args, context, { rootValue }) => {
return postRepository.getBody(context.user, post);
}
}
}
});

Yukarıdaki örnekte, iş mantığı katmanı, arayanın bir Kullanıcı (the User) nesnesi sağlamasını gerektirdiğini görürüz. GraphQL.js kullanıyorsanız, Kullanıcı nesnesinin context argümanı üzerine doldurulumalı veya rootValue çözümleyicinin dördüncü argümanı doldurulması gerekir.

İş mantığı katmanına opak bir simge veya API anahtarı yerine tamamen hidrate edilmiş kullanıcı nesnesi iletmenizi öneririz. Bu şekilde, istek işleme hattının farklı aşamalarında kimlik doğrulama ve yetkilendirme ile ilgili farklı endişeleri halledebiliriz.

--

--

Mehmet Ali Peker
Sorcial Development

Co-Founder at T-Fashion / Fashion AI & Trend Forecasting / Web3 / NFTs