【问题标题】:Using the new Devise for authentication for a mobile app使用新的 Devise 对移动应用程序进行身份验证
【发布时间】:2014-02-10 11:51:29
【问题描述】:

我正在尝试使用 Devise 为我的 Rails/iOS 应用程序实现用户身份验证。我遇到了麻烦,因为我主要是 Devise 的“用户”,并且将它用于纯网络应用程序,所以不需要太在意幕后发生的事情。现在我必须为基于 API 的应用程序构建身份验证,这完全是一个不同的世界。

我已经阅读了每个网络上涉及该主题的教程(由于token_authenticatable 已被弃用,其中大部分都已过时),但仍然无法理解我的内容需要做的。

我还阅读了 GitHub 原版 gist 谈论 this issue ,但仍然不明白他们在说什么。

我确定有些人和我一样,他们只是Devise 的“用户”,所以真的不知道幕后发生了什么。

谁能提供一个简洁的解决方案来为移动应用实现基于 API 的身份验证系统?我的意思是它不可能那么复杂,Devise 曾经非常棒,因为我需要做的就是运行rails generate,但这对我来说是一场噩梦。

【问题讨论】:

  • 本指南中是否有什么特别不合理的地方:slideshare.net/apartmentlist/… 您在 Rails 端、iOS 端或两者都有问题吗?到目前为止,您尝试过什么?
  • 1.向您的设备控制器发送登录请求。 2. 使用登录身份验证令牌进行响应。 3. 将身份验证令牌存储在 NSUserDefaults 或钥匙串中。 4. 使用身份验证令牌发出用户私有请求。
  • 该幻灯片使用了 token_authenticable,正如我所提到的,它已被弃用。现在我知道大局了,但由于涉及的所有复杂性,我只是不知道如何详细实施它
  • 查看这篇文章并了解如何替换此方法的一个组件:stackoverflow.com/a/18933419/614152
  • 感谢您的建议,我也看过那个帖子,但忽略了它,因为使用该解决方案支持向后兼容性感觉不对,但我想我真的别无选择.但我很困惑为什么我必须经历所有这些麻烦才能使用 Devise。它曾经非常简单,我需要做的就是生成 rails 并添加一些配置,并且我有一个身份验证系统。我的意思是我明白他们为什么必须这样做,但我不明白为什么没有一个优雅的解决方案

标签: ruby-on-rails authentication mobile devise


【解决方案1】:

我正在做你想做的事情,

为此,您必须使用令牌身份验证而不是简单的 设计,在 gemfile 中添加以下 gem

  # Use device for authentication
    gem 'devise'
    gem 'simple_token_authentication'

关注文档simple_token_authentication

Use Api like this

curl -v https://example.com/users/sign_in -X POST -H "Accept: application/json" -H "Content-Type: application/json" -d '{"user": {"login": "7838712847" ,"password": "8489", "mobile_type": "ios", "mobile_key": "APA91bG6G4UvjeCWvb8mMAH1ZO3I-8FB3nkRPyCHnwZiXgd16HK18GgoV5n7gjJtZNs038iaFGutzdxnhes3WyaXEX52-xmOyvuEK8S1abBdpuhD9AD5bzLWeu-1Ow_yZRTVg3Nypz1z"}}'

I am using mobile number to login so customize gem according your need

如果它不起作用,请告诉我(给我发邮件:er.mukeshsharma.rj21@gmail.com)

【讨论】:

    【解决方案2】:

    最近,我们还必须为我们的 web 应用程序设置基于令牌的身份验证(用于 API 访问) - 我们还偶然发现它已从 Devise 中删除。

    我们选择了Simple Token Authentication,效果非常好。

    【讨论】:

      【解决方案3】:

      当在 Rails 应用程序中使用 Devise 进行身份验证时,这是一种非常适合我的方法。如果首先测试令牌(您可以通过任何 iOS、Android、... 应用程序设置令牌)并回退到您的网络用户的默认身份验证方法。

      导轨

      通过添加 :api_token 字符串列并将您自己的令牌添加到用户模型,并为每个用户填充一个唯一值。使用一些用户数据(如 id + 电子邮件)的 Digest::SHA1 是一个很好的起点,但在生成唯一令牌时,您可以(并且应该)随心所欲。

      创建一个通过该令牌进行身份验证的方法。您可以将其添加到您的主 ApplicationController 以便于访问(不要忘记将方法放在控制器的私有部分中);

      def authenticate_user_by_token
        @api_token = request.headers['HTTP_AUTHORIZATION']
      
        if @api_token.present? && @user = User.find_by_api_token(@api_token)
          sign_in @user
          return @user
        else
          return false
        end
      end
      

      接下来创建一个(私有)方法并将此方法链接到您正在使用的过滤方法之前的设计(例如:authenticate_user!)。与上述方法放在同一个控制器中,方便访问;

      def authenticate_by_token_or_devise!
        return authenticate_user! unless authenticate_user_by_token
      end
      

      现在替换来自 :authenticate_user 的当前 before_filter 调用!到新创建的; :authenticate_by_token_or_devise!,像这样;

      before_filter :authenticate_by_token_or_devise!
      

      或者,从 rails 4 (Rails 4: before_filter vs. before_action) 开始,使用 before_action;

      before_action :authenticate_by_token_or_devise!
      

      iOS

      现在您所要做的就是将该令牌添加到您的 iOS 应用程序中。根据您在应用程序中使用的框架,这可能与下面的代码不同。

      我在这个例子中使用了 AFNetworking (https://github.com/AFNetworking/AFNetworking)。这就是您在 AFHTTPRequestOperationManager 中设置 Authorization 标头令牌的方式,以便将其添加到您发出的每个请求中。

      NSString *apiToken = @"your-token-here";
      [[_manager requestSerializer] setValue:apiToken forHTTPHeaderField:@"Authorization"];
      

      可选

      此外,您可以像这样创建一个前置过滤器方法,该方法仅允许访问基于令牌的身份验证(例如,如果您有一组您只想使用令牌访问的 /api 路由);

      def authenticate_user_by_token!
        if !authenticate_user_by_token
          render nothing: true, status: :unauthorized and return
        end
      end
      

      【讨论】:

      • 认真的吗?为每个用户生成一个静态令牌?
      【解决方案4】:

      当我最近实现一个 API 时,我不情愿地遵循了使用基于机架的身份验证 gem Warden 的建议。我的感觉是,要求您编写自己的身份验证的身份验证 gem 被破坏了。但是这个 gem 提供了恰到好处的控制水平。我唯一的抱怨是 gem 不能很好地处理 POST 参数。 I was able to work around it,但这种问题应该(IMO)由 gem 处理。

      使用过它后,我强烈推荐这个 gem 用于任何需要非通用身份验证的场景。滚动您自己的身份验证策略是一种乐趣,因为 (a) 它非常简单,并且 (b) 您不受其他开发人员假设的约束。

      为了帮助您入门,here is my config/initializers/warden.rb file

      【讨论】:

        【解决方案5】:

        您可以结合使用 devise gem 和 doorkeeper gem 来支持 Web 和移动身份验证。

        例如,我使用 devise 来注册用户并处理忘记密码和电子邮件确认流程。对于移动客户端,我使用 doorkeeper gem 作为 oauth2 提供程序来保护我的 api。门卫 gem 支持许多 oauth2 授权流程,我建议您可以看看这些。

        这里是a link!开始吧

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-22
          • 2016-02-15
          • 2017-01-10
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 2022-07-31
          • 2017-07-24
          相关资源
          最近更新 更多