密码更新时出现未经授权的错误

Posted

技术标签:

【中文标题】密码更新时出现未经授权的错误【英文标题】:Unauthorize error on password update Devise 【发布时间】:2016-06-29 04:56:28 【问题描述】:

我正在使用 rails api 并使用 devise_token_auth 进行身份验证,当我尝试通过使用 put 请求点击 /auth/password 来更新密码时,它会以错误 401 (即未经授权)响应。我的服务器日志显示了这个

开始 PUT "/auth/password" 处理 DeviseTokenAuth::PasswordsController#update 作为 html 参数: “密码”=>“[过滤]”,“密码确认”=>“[过滤]” 无法验证 CSRF 令牌的真实性 Completed 401 Unauthorized in

routes.rb

mount_devise_token_auth_for 'User', at: 'auth' ,:controllers =>  :omniauth_callbacks => 'omniauth'  

view.html (angularjs)

<div class="container">
    <div class="row">

    <div class="row">
       <div class="col-xs-6 col-xs-offset-3 que">
           <img src="./uploads/img/web-logo.png" class="img-responsive" >
       </div>
    </div>
        <div class="col-xs-12 reset-pas">
            <form  name="update_pass" ng-submit="updatePassword_controller()" role="form" class="lost_reset_password">
                <p class="error_msg" ng-show="update_pass.password_confirmation.$error.passwordVerify"> 
                    Passwords are not equal!
                </p>
            <label>New password</label>
            <input type="password" name="password"  ng-minlength="8"  ng-model="updatePasswordForm.password" required="required" class="form-control">
            <span>Minimum 8 Charachters</span>
    <br>
            <label>Re-enter new password</label>

            <input type="password" name="password_confirmation"  ng-minlength="8"  ng-model="updatePasswordForm.password_confirmation" required="required" class="form-control"  password-verify="updatePasswordForm.password" >
                <button type="submit" class="btn btn-default" id="reset-submit">Save</button>
            </form>
        </div>
    </div>
</div>

controller.js

$scope.updatePassword_controller = function() 

  $auth.updatePassword($scope.updatePasswordForm)
    .then(function(resp) 
      console.log(resp)
      $location.path('/')
    )
    .catch(function(resp) 
      console.log(resp)
    );
;

更新 注意 我只在密码更新时遇到这个问题

更新

我安装了gem 'angular_rails_csrf' 现在它只提供authorization error 而不是csrf attack error

【问题讨论】:

您是如何提出请求的?您的请求中缺少 CSRF (authenticity_token)。 @zekus 亲爱的,我该如何添加? 这个问题是在这里提出的***.com/questions/14734243/… 也检查这个solidfoundationwebdev.com/blog/posts/…。我猜应该可以解决。 @zekus 亲爱的,还是一样的问题 【参考方案1】:

使用 Rails form_tagform_for 助手。他们添加将为 XCSRF 令牌添加一个隐藏字段:

<div class="container">
    <div class="row">

    <div class="row">
       <div class="col-xs-6 col-xs-offset-3 que">
           <img src="./uploads/img/web-logo.png" class="img-responsive" >
       </div>
    </div>
        <div class="col-xs-12 reset-pas">
            <%= form_tag "#",  "ng-submit" => "updatePassword_controller()", "role" => "form", "class" => "lost_reset_password" do %>
                <p class="error_msg" ng-show="update_pass.password_confirmation.$error.passwordVerify"> 
                    Passwords are not equal!
                </p>
            <label>New password</label>
            <input type="password" name="password"  ng-minlength="8"  ng-model="updatePasswordForm.password" required="required" class="form-control">
            <span>Minimum 8 Charachters</span>
    <br>
            <label>Re-enter new password</label>

            <input type="password" name="password_confirmation"  ng-minlength="8"  ng-model="updatePasswordForm.password_confirmation" required="required" class="form-control"  password-verify="updatePasswordForm.password" >
                <button type="submit" class="btn btn-default" id="reset-submit">Save</button>
            </form>
        </div>
    </div>
</div>

【讨论】:

我的错模板在 anuglarjs html 中 您的意思是您正在使用静态 html 在 Rails 之外部署 Angular 应用程序?在这种情况下,您需要禁用 Rails CSRF 保护,因为它依赖于服务器端渲染。 如果您使用基于令牌的身份验证,您可以通过删除会话中间件来完成此操作。 最初是在更新密码,但我不知道为什么它停止了。另外我不知道如何删除会话中间件【参考方案2】:

我只是在 applicationcontroller.rb 中设置了一个条件,如下所示。主要思想是简单地覆盖设计的功能

        if params[:controller] == "devise_token_auth/passwords" && params[:action] == "update"

              uri               = URI.parse(request.headers.env['HTTP_REFERER'])
              query_params      = CGI.parse(uri.query)
              email             = query_params['uid'].first
              user              = User.find_by_email(email)
              user.password     = params[:password]
              user.password_confirmation = params[:password_confirmation]

              if user.save
                    render json: message: 'Password Updated successfully', status: 200                        
              else
                    render json: message: 'Password Could not changed , Please contact to support Team', status: 401
              end
        end

虽然这不是正确的解决方案,但我想不出任何其他解决方案。所以请耐心等待。我们正在从 url 获取电子邮件

【讨论】:

以上是关于密码更新时出现未经授权的错误的主要内容,如果未能解决你的问题,请参考以下文章

配置两个安全配置时出现未经授权的错误[重复]

使用 Axios 和 Firebase 时出现 401 未经授权的错误

在 GCM 中发送推送通知时出现未经授权的错误

从角度访问webapi时出现401未经授权的错误

尽管有 CORS,但在使用 jHipster oAuth 时出现未经授权的错误

使用 jenkins 将 java 合同发布到协议流时出现未经授权的错误