从原生Android应用程序

时间:2015-09-28 20:10:40

标签: android ruby-on-rails authentication token

我正在尝试开发一个主要与Android应用用户通信的Rails应用。人们应该能够在应用内注册并登录(他们只能在登录时执行大多数请求)。

我查看了许多有关如何在应用上执行“存储会话”的教程,但所有这些教程都建议使用gem 'devise'及其:token_authenticable,这是已弃用一段时间了。

我想就如何执行同等的事情提出严肃的建议。根据我的理解,客户端发送带有{email: "some@email.com", password: "pw12345"}等参数的请求,我检查它们是否与现有用户匹配并检索字符串令牌,此客户端将从现在开始通过标头发送每个请求(例如{ {1}})。

我已经设置了一些伪值的方法,比如

{"my_app_user_email": "some@email.com", "my_app_user_token":"abcdef123456"}

其中def login if valid_user?(params[:email], params[:password]) render json: {user_token: default_user_token} else render json: {message: 'Couldn\'t login'}, status: 401 end end 是固定字符串,default_user_token也与固定值进行比较。

我想我的问题是知道这是否是正确的方法,如果是这样,我如何制作一个valid_user?模型来创建和验证令牌?

额外的代码

User

1 个答案:

答案 0 :(得分:1)

我认为你的方法是正确的。您可以在模型中添加auth_token字段,并在用户登录时生成新字段。您可以生成如下标记:

def generate_authentication_token!
    begin
        self.auth_token = Devise.friendly_token
    end while self.class.exists?(auth_token: auth_token)
end

您可以创建一个身份验证服务,该服务需要用户令牌来处理每个请求:

module Authenticable

  #Devise overwritten method
  def current_user
    @current_user ||= User.find_by(auth_token: request.headers['Authorization'])
  end

  def authenticate_with_token!
    render json: { errors: "Not authenticated" }, status: :unauthorized unless user_signed_in?
  end

  def user_signed_in?
    current_user.present?
  end

end

然后,您可以使用设计创建一个登录/注销用户的SessionsController:

def create
    user_password = params[:session][:password]
    user_email = params[:session][:email]
    user = user_email.present? && User.find_by(email: user_email)

    if user
      if user.valid_password? user_password
        sign_in user, store: false
        user.generate_authentication_token!
        user.save
        render json: user, root: :user, status: 200, location: [:api, user]
      else
        render json: { errors: "Invalid email or password" }, status: 422
      end
    else
      render json: { errors: "Invalid email or password" }, status: 422
    end
  end

def destroy
    user = User.find_by(auth_token: params[:id])
    user.generate_authentication_token!
    user.save
    head 204
end

我在github上有这个使用此解决方案的回购:https://github.com/brunojppb/api_on_rails