Sinatra を使用して API を構築しています。これは、リクエストを送信するクライアント アプリのユーザー ログイン セッションを管理できるはずです。これまでのところ (ログイン機能のために) 私が得たのは /login のルートであり、ユーザー資格情報が有効であれば、RDBMS で AccessToken が作成されます。下記参照:
#
# Login
#
post '/login' do
if (@input["email"].nil? || @input["password"].nil?) then
response = {
"success" => false,
"msg" => "Email and password must be provided"
}
$log.error "Email or password not sent to /login"
return response.to_json
end
email = @input["email"]
password = Digest::SHA2.hexdigest(@input["password"])
user = User.where(:email => email, :password => password).first
if user.nil?
response = {
"success" => false,
"msg" => "No users exist with that email/password combo"
}
$log.error "Invalid Email or Password sent to /login"
return response.to_json
end
token = AccessToken.new(:user_id => user.id)
token.save!
$log.info "User valid. Logged in. Token: #{token.token}"
response = {
"success" => true,
"msg" => "User logged in",
"data" => {"token" => token.token}
}
return response.to_json
end
次に、認証が必要な他のルートについては、トークンがリクエストのパラメーターとして送信されているかどうかを確認しています。
#
# Return Clients for User
#
# get '/clients/:token' do
get '/clients' do
token = AccessToken.where(:token => params[:token]).first
@current_user = User.find(token.user_id) unless token.nil?
if @current_user.nil?
response = {
"success" => false,
"msg" => "User must be logged in to do this"
}
$log.error "User is not logged in"
return response.to_json
end
response = {
"success" => true,
"msg" => "Clients successfully retrieved",
"data" => {"clients" => @current_user.clients}
}
$log.info "Clients successfully retrieved"
return response.to_json
end
だから私は疑問に思っています:(a)これはAPIを使用してユーザーセッションを処理するための優れた/堅牢な方法であり、(b)クライアント側(iOS、Android、およびWebアプリ)でそれを処理する標準的な方法はありますか? おそらくアクセストークンをセッション変数に保存し、リクエストごとに送信されるパラメーターにトークンを追加する必要がありますか?
ありがとう!