Ruby on Rails REST API'de Access Token Kullanarak Kullanıcı Doğrulama
Öncelikle;
HTTPS kullanın. Çünkü HTTP kullanıldığında parametreler plain text olarak iletiliyor. Http Request’ leri dinleyen birisi keylerinize çok rahat ulaşabilir.
access_token’ ları url den parametre olarak almak yerine Http Header’ dan almak daha uygundur. Çünkü kullanıcı alışkanlıkları (kopyala-yapıştır-test et) yönündedir. URL de unutulan tokenlar güvenlik için tehlikeli olabilir.
API’ de güvenliği sağlamanın diğer bir yolu ise API’ yi kullanacak client’ lara bir API_KEY verip o API_KEY ile authenticate yapmak. Bu yöntemi kullanırsak API_KEY leri saklamak için bir modele ihtiyacımız olacak.
Bu modelde;
user_id
access_token
expires_at
alanlarını tutacağız. Eğer API_KEY ömrünü kısıtlamak istemiyorsanız expires_at alanına ihtiyacınız yok.
Ben burada örneği kısa tutmak için user_id ve expires_at alanlarını kullanmayacağım.
1234567
Muhammets-iMac:pigon muhammetdilek$ rails g model api_key access_token:string
invoke active_record
create db/migrate/20121006130334_create_api_keys.rb
create app/models/api_key.rb
invoke test_unit
create test/unit/api_key_test.rb
create test/fixtures/api_keys.yml
Burada access_token üretmek için ruby 1.9’ la gelen SecureRandom.hex metodunu kullanarak 16 haneden oluşan string bir access_token oluşturuyoruz. Eğer oluşturulan bu access_token daha önceden oluşturulmuş ise kod daha önceden oluşturulmayan bir access_token üretinceye kadar tekrar çalışıyor.
Şimdi bir ApiKey oluşturup devam edelim.
12345678910
Muhammets-iMac:pigon muhammetdilek$ rails c
Loading development environment (Rails 3.2.8)1.9.3p194 :001 > ApiKey.create
(0.0ms) begin transaction
ApiKey Exists (0.1ms) SELECT 1 AS one FROM "api_keys" WHERE "api_keys"."access_token"='765582c8bf829e682abe70618957a42a' LIMIT 1
Binary data inserted for`string`type on column `access_token` SQL (35.5ms) INSERT INTO "api_keys"("access_token", "created_at", "updated_at") VALUES (?, ?, ?)[["access_token", "765582c8bf829e682abe70618957a42a"], ["created_at", Sat, 06 Oct 2012 13:11:59 UTC +00:00], ["updated_at", Sat, 06 Oct 2012 13:11:59 UTC +00:00]](2.0ms) commit transaction=> #<ApiKey id: 1, access_token: "765582c8bf829e682abe70618957a42a", created_at: "2012-10-06 13:11:59", updated_at: "2012-10-06 13:11:59"> 1.9.3p194 :002 >
Controller’ a access_token kontrolü yapan bir metod yazacağız;
http://pigon.dev/api/products adresini açtığımızda bize hiçbir datanın dönmediğini görüyoruz. Birde query olarak access_token ekleyerek bakalım;
Evet gördüğünüz gibi urlden acces_token alarak datalara erişim kısıtlaması getirebiliyoruz. access_token’ bilgilisini URL’ den almak yerine HTTP Header dan alalım.
Rails’ te HTTP header’ dan access_token almak için authenticate_or_request_with_http_token metodunu kullancağız.