我有一个rails应用程序,它包含所有前端部分,管理和注册/登录/注销(设计)。
我还有一个包含更多动态地图的部分,这些地图是用javascript React编写的。它在同一个应用程序中单独在控制器/视图上运行。
我使用Grape创建了一个api,将数据暴露给React。
我的问题是如何知道用户是在没有使用令牌的情况下登录的。
哪条路?我可以使用存储在浏览器中的cookie和会话吗?怎么会?
我可以通过以下方式获取用户ID:
user_id = env['rack.session']['warden.user.user.key'].first.first
那没关系?
User.find(user_id)
安全吗?
答案 0 :(得分:1)
我的一个应用程序我使用了如下所示的设计身份验证:
#require 'grape'
module Base
class API < Grape::API
prefix 'api'
version 'v1', :using => :header, :vendor => 'vendor'
format :json
helpers do
def current_user
user = User.where(authentication_token: params[:auth_token], is_approved: true).first
if user
@current_user = user
else
false
end
end
def authenticate!
error!('401 Unauthorized', 401) unless current_user
end
end
# load the rest of the API
mount V1::Registration
mount V1::Sessions
end
end
module V1
class Sessions < Grape::API
version 'v1', using: :path
format :json
prefix :api
resource :sessions do
##<$ User Sign In API $>##
desc 'Authenticate user and return user object / access token'
params do
requires :email, type: String, desc: 'User email'
requires :password, type: String, desc: 'User Password'
end
post do
email = params[:email]
password = params[:password]
if email.nil? or password.nil?
error!({error_code: 404, error_message: 'Invalid Email or Password.'}, 401)
return
end
user = User.where(email: email.downcase).first
if user.nil?
error!({error_code: 404, error_message: 'Invalid Email or Password.'}, 401)
return
end
if !user.valid_password?(password)
error!({error_code: 404, error_message: 'Invalid Email or Password.'}, 401)
return
else
user.ensure_authentication_token
user.save
{status: 'ok', auth_token: user.authentication_token}
end
end
desc 'Destroy the access token'
params do
requires :auth_token, type: String, desc: 'User Access Token'
end
delete ':auth_token' do
auth_token = params[:auth_token]
user = User.where(authentication_token: auth_token).first
if user.nil?
error!({error_code: 404, error_message: 'Invalid access token.'}, 401)
return
else
user.reset_authentication_token
{status: 'ok'}
end
end
end
end
end