使用set_user_by_token设计问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用set_user_by_token设计问题相关的知识,希望对你有一定的参考价值。

我有一个可能是一个简单的问题,我似乎无法找到一种方法来解决它虽然我确实找到了它的位置。

我想要做的是使用devise_token_auth设置devise密码重置。我有使用令牌生成器设置的电子邮件,并且电子邮件链接到终点'/api/auth/passwords/edit',它验证令牌然后重定向到我的前端密码重置表单(如果重要的话,在reactjs中完成),当我实际提交时,问题就出现了表格,我发送令牌,我也发送密码和确认,到期,uid和所有其他标题。

所以这是问题,设计密码控制器调用之前的动作set_user_by_token,我通过一些调试发现这就是问题所在,我使用set_users_by_token的默认代码创建并覆盖模块,并通过使用binding.pry我看到没有值通过方法调用进入,但该方法被调用,因为它击中了撬。

继承人的方法代码

  def set_user_by_token(mapping=nil)
    # determine target authentication class
    rc = resource_class(mapping)

    # no default user defined
    return unless rc

    # gets the headers names, which was set in the initialize file
    uid_name = DeviseTokenAuth.headers_names[:'uid']
    access_token_name = DeviseTokenAuth.headers_names[:'access-token']
    client_name = DeviseTokenAuth.headers_names[:'client']

    # parse header for values necessary for authentication
    uid        = request.headers[uid_name] || params[uid_name]
    @token     ||= request.headers[access_token_name] || params[access_token_name]
    @client_id ||= request.headers[client_name] || params[client_name]

    # client_id isn't required, set to 'default' if absent
    @client_id ||= 'default'
    # check for an existing user, authenticated via warden/devise, if enabled
    if DeviseTokenAuth.enable_standard_devise_support
      binding.pry
      devise_warden_user = warden.user(rc.to_s.underscore.to_sym)
      if devise_warden_user && devise_warden_user.tokens[@client_id].nil?
        @used_auth_by_token = false
        @resource = devise_warden_user
        # REVIEW: The following line _should_ be safe to remove;
        #  the generated token does not get used anywhere.
        # @resource.create_new_auth_token
      end
    end

    # user has already been found and authenticated
    return @resource if @resource && @resource.is_a?(rc)

    # ensure we clear the client_id
    if !@token
      @client_id = nil
      return
    end

    return false unless @token

    # mitigate timing attacks by finding by uid instead of auth token
    user = uid && rc.find_by(uid: uid)

    if user && user.valid_token?(@token, @client_id)
      # sign_in with bypass: true will be deprecated in the next version of Devise
      if self.respond_to?(:bypass_sign_in) && DeviseTokenAuth.bypass_sign_in
        bypass_sign_in(user, scope: :user)
      else
        sign_in(:user, user, store: false, event: :fetch, bypass: DeviseTokenAuth.bypass_sign_in)
      end
      return @resource = user
    else
      # zero all values previously set values
      @client_id = nil
      return @resource = nil
    end
    end

因为没有满足其他条件,所以在最后它击中其他并返回资源为零。

任何帮助都会非常感激,我很确定这就是问题所在,因为我已经调试好几天了,这就是它带领我的地方

答案

如果你在这里,因为你有同样的问题我希望我能帮助你!经过几个小时的艰苦调试和测试,我克服了它,这可能是一种解决方法或蹩脚的方法,但它仍在使用设计方法时工作。

在您的passwords_controller.rb中应该有一个“before_action:set_user_by_token,only:=> [:update]”

将“:set_user_by_token”更改为您想要命名的新方法,然后将该方法复制并粘贴到原始帖子中并进行一些小的更改。

改变这些线:

    uid          = request.headers[uid_name] || params[uid_name]
    @token     ||= request.headers[access_token_name] || params[access_token_name]
    @client_id ||= request.headers[client_name] || params[client_name]

uid          = params[uid_name]
@token     ||= params[access_token_name]
@client_id ||= params[client_name]

并做了。现在你不必乱用任何初始化器或关注点!

希望我能帮助别人!

以上是关于使用set_user_by_token设计问题的主要内容,如果未能解决你的问题,请参考以下文章

设计模式基础

设计模式与代码结构分析

9000字,唠唠架构中的设计模式

1初识设计模式

同一路径上的多个二进制文件的代码设计问题

使用共享框架的 Fastlane 代码设计失败