Öncelikle herkese iyi forumlar.
Ruby on Rails ile bir proje yapıyorum ve bu projenin ufak bir kısmını api olarak kullanmak istiyorum.
Yapmak istediğim şey api işlemlerine başlamadan önce kullanıcının giriş yapması ve bu girişi yapmadan işlemlerin yapılamaması.
Bunun için kullanıcı giriş yaparken session ve cookies kullandım fakat giriş yaptıktan sonra burada kayıtlı kullanıcıyı bulamıyorum.
Kodlarım:
ApiController.rb:
class ApiController < ApplicationController
skip_before_action :verify_authenticity_token
before_action except:%i[ deneme create ] do
unless signed_in?
render json:{message:"Lütfen giriş yapın"}
end
end
def new
end
# FIXME burası silinecek
def deneme
render json:{user_id:cookies[:api_user_id]}
end
#
def create
user = ApiUser.find_by_username(params[:username])
if user && user.authenticate(params[:password])
cookies[:api_user_id] = user.id
render json:{message:cookies[:api_user_id]}
else
render json:{message:"False"}
end
end
private
def current_user
@api_current_user ||= ApiUser.find(cookies[:api_user_id]) if cookies[:api_user_id] && ApiUser.exists?(cookies[:api_user_id])
end
def signed_in?
current_user
end
end
Gönderdiğim requests:
require "httparty"
HTTParty.get("http://localhost:3000/api")
# Çıktısı => {message:"Lütfen giriş yapınız"}
HTTParty.post("http://localhost:3000/api",:body => {username:"Geçerli kullanıcı adı",password:"Geçerli bcrypt ile şifrelenmiş şifre"})
# Çıktısı => {message:"giriş yapılan kullanıcının id'si"}
HTTParty.get("http://localhost:3000/api/deneme")
# Çıktısı => {user_id:nil} Sorun burada
Cok fazla cookie’lerle ugrasmiyorum o yuzden yanlis yonlendirmek istemem ancak:
Senin kodlarin ile alakali
Yazdigin kodlar icinde: HTTParty.get("http://localhost:3000/api/deneme")
kullanarak render json:{user_id:cookies[:api_user_id]}
ile cevap vererek {user_id:nil} cevabini vermesi gayet normal, cunku
render json:{user_id:cookies[:api_user_id]} cookies[:api_user_id] zaten senin gondermen gereken birsey. eger cookie uzerinden gonderilen birseyse, cookie’nin uzerine dogru yazmamis olabilirsin, cookie’nin uzerine yazdigin kismin kodunu paylasmamissin.
Ayrica sorunun uzerine bir onerim olacak:
Bu islem icin Devise kullanmani oneririm. Devise ile basarili giris yaptiktan sonra current_user sana login olmus kullaniciyi verecektir.
Bu yazdigin kodlar uzerinden bir authentication yapman dogru degil. Dogru kullanici adi ve parola ile Token olusturup, bu token’i kullanmani tavsiye ederim. Uretilen Token ise belli bir sure sonra kullanilmayinca suresi dolmali. Ayrica isteyen kisi, kendi cookie’sine istedigi kullanici ID’sini yazip, onu kullanabilir, buda pek hos birsey degil tabiki
kolay gelsin
Elimde API icin auth hizmeti veren bir taslak repo var, ancak paylasmadan once duzenlemem gerekiyor. Elimdeki repoyu daha cok suiki kaynagi kullanarak olusturmustum. Paylasmaya hazir oldugunda haber veririm
Şirket olarak geliştirdiğimiz, authentication süreçleri de dahil olmak üzere daha bir çok yapıyı içinde hazır olarak getiren open-source bir rails api boilerplate uygulamamız var, buradan ulaşabilirsin, belki işine yarayabilir
@selcuktoklucu, @nejdetkadirr hocalarım çok saolun tokeni oluşturduktan sonra HTTParty.get("http://localhost:3000/api",headers:{'token':token}) şeklinde gönderince istediğim gibi giriş yapabildim emekleriniz için teşekkür ederim <3.