移动应用程序框架使用Rails Devise进行身份validation

我目前正在为使用Ruby on Rails和Devise的网站实施移动应用程序。 这里的想法首先是创build一个移动login表单,在成功login时打开一个经过身份validation的Web框架,并允许(移动优化)站点的正常使用。 理论上这应该是可能的。 我遇到以下问题:

  1. 如何通过json请求获得用户会话的纯会话密钥? 可以使用什么方法从devise手动生成它, sign_in(:user, user)方法呢?

  2. 是否有可能采取这个关键,并将其放入浏览器cookie的方式通常发生在devise,但在移动端?

我知道这不是为网站制作移动应用程序的标准方法,但我相信它应该是可能的。

Related of "移动应用程序框架使用Rails Devise进行身份validation"

您可能需要考虑使用Devise Token Auth,并将您的移动应用程序视为另一个请求来自主站点许可的Web应用程序。 DTA特别好,因为它负责pipe理会话令牌(更新/到期)并将其传递到需要访问的应用程序。 这个问题是覆盖你的会话控制器,以便它在login到移动应用程序后自动login(或者只是重写你的login,所以它和Rails站点一起发生,而不是之前)。 考虑到你已经在使用Devise,这可能会比你想要的更重构。

如果您想要将authentication表单放在移动UI上,并将凭证传递给Web框架,则需要将数据从移动应用程序传递到Web框架。

你如何做到这一点取决于你在哪个平台上build立。 我不是一个真正的移动开发者,所以我不确定这些选项有多么困难/容易:

  1. 打开Web框架时,使用会话数据实例化它
  2. find从Web框架调用客户端上的方法的方法。 像getSessionData
  3. 您可以为Web框架生成指纹,移动UI将此数据发送到服务器,然后通过发送指纹使Web框架与服务器进行身份validation。

再次,我不完全确定所有这些选项有多可能。

您应该使用令牌授权和Android深度链接。 它将允许您通过Web浏览器login并通过深层链接将令牌发送到您的应用程序。

好的,所以我决定做一个webframe解决scheme如下,基本上你把login和密码发布到一个特定的sign_in方法,专门devise用来为应用程序生成一次性的令牌。 你需要在系统中有两个方法来做到这一点:

的routes.rb

 devise_scope :user do get "sign_in_with_token/:token" => "sessions#sign_in_with_token" post "get_login_token" => "sessions#get_login_token" end 

sessions_controller.rb(不要忘记添加方法,增加了错误的密码failed_sign_in_count,否则可以允许蛮力攻击)

 def get_login_token user = User.find_by_email(sign_in_params["login"]) password = sign_in_params["password"] if user and user.valid_password?(password) token = SecureRandom.hex(16) user.update_attribute(:authentication_token, token) render json: {token: token}, status: 200 else render json: {error: "error"}, status: 403 end end 

以及使用该令牌login的方法

 def sign_in_with_token @user = User.where(authentication_token: params[:token], email: Base64.decode64(params[:email])).first if @user @user.update_attribute(:authentication_token, nil) sign_in(@user, bypass: true) end redirect_to '/' # or user_root_url end 

这样的移动应用程序将像这样工作:

  1. 如果密码正确,则使用通用Web框架向服务器发送ajax请求并获取用户电子邮件的令牌。
  2. 在应用程序内部创build一个/ sign_in_with_token /#{token from ajax}?email =#{base46编码的电子邮件}链接。
  3. 打开Web框架内的链接,并像使用正常login一样使用该应用程序。 现在,应用程序可以在本地保存电子邮件和密码,并使用该逻辑再次获取令牌以进行其他会话。 稍后login也将能够设置应用程序ID,以便可以发送推送通知。

欣赏任何对此解决scheme的反馈或批评。