在葡萄中设计用户身份验证

时间:2015-08-25 21:54:25

标签: ruby-on-rails devise grape grape-api

我有一个rails应用程序,它包含所有前端部分,管理和注册/登录/注销(设计)。

我还有一个包含更多动态地图的部分,这些地图是用javascript React编写的。它在同一个应用程序中单独在控制器/视图上运行。

我使用Grape创建了一个api,将数据暴露给React。

我的问题是如何知道用户是在没有使用令牌的情况下登录的。

哪条路?我可以使用存储在浏览器中的cookie和会话吗?怎么会?

我可以通过以下方式获取用户ID:

user_id = env['rack.session']['warden.user.user.key'].first.first

那没关系?

User.find(user_id)

安全吗?

1 个答案:

答案 0 :(得分:1)

我的一个应用程序我使用了如下所示的设计身份验证:

api.rb

#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

sessions.rb

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