【发布时间】:2018-08-01 04:16:55
【问题描述】:
我知道还有其他类似的问题,但在我的情况下没有一个答案有效。我正在尝试通过 API 对用户进行身份验证。更具体地说,我有一个 iPhone 应用程序充当“客户端”,它将发布请求发送到我拥有的会话控制器。这里是:
class V1::SessionsController < ApplicationController
def create
@user = User.find_by_username(params[:username])
if @user
if @user.valid_password?(params[:password])
sign_in(@user)
render :create
else
render_error_for @user
end
else
render json: {
status: 'ERROR',
data: ['Incorrect Username']
}, status: :unauthorized
end
end
end
我在网上看到sign_in(@user) 应该让用户登录,但这并没有按预期工作。此外,我读到您应该在登录之前重新加载用户,如下所示:@user.reload。这也不起作用。我想知道这是否与我没有从Devise::SessionsController 继承的事实有关。我学会了如何在线制作这样的会话控制器,所以这可能是问题所在。
我测试的方法是在 rails 控制台中运行user.last_sign_in_at,但我得到的只是nil,我很确定这意味着设计没有成功登录用户.任何帮助表示赞赏,谢谢。
更新
def create
@user = User.find_by_username(params[:username])
if @user
if @user.valid_password?(params[:password])
@user.last_sign_in_at = Time.now
render :create
else
render_error_for @user
end
else
render json: {
status: 'ERROR',
data: ['Incorrect Username']
}, status: :unauthorized
end
end
我找到了一个可能的解决方案,但我没有将其标记为解决方案,因为在我看来这个解决方案并不安全。我实质上是用我自己的流程来创建会话(并将 DateTime 分配给 last_sign_in_at 字段)来代替 Devise 的流程。这安全吗?或者这样做是个坏主意?硬编码 Devise 的 sessions#create 操作由于某种原因不起作用。我推测这与这是一个 API 而不仅仅是一个常规网站这一事实有关。
【问题讨论】:
-
根据我的建议,请选择
gem doorkeeper
标签: ruby-on-rails api devise