2016-11-21 72 views
3

我正在尝试构建一个rails API,并使用devise_token_auth gem进行使用令牌的用户身份验证。Devise_token_auth重置密码流401错误

我设法正确地设置了一切,只是遇到了问题。每当我尝试重置密码时,我都会从API获取401未经授权的错误。

的流程如下:

  1. 用户点击“忘记了密码”按钮
  2. 用户被重定向到一个前端应用程序与一个形式插入其电子邮件
  3. 前端应用发出POST请求发送到API 'AUTH /密码' 与电子邮件REDIRECT_URL PARAMS
  4. 所述API通过生成reset_password_token和发送电子邮件到电子邮件参数
  5. 用户内提供的电子邮件地址来响应此请求点击在电子邮件中的链接,它通过口令重置带来他们的“验证用户令牌”端点(GET /密码/编辑)
  6. 这个端点验证用户,并将其重定向到REDIRECT_URL
  7. REDIRECT_URL是在前端一个网页,其中包含密码password_c onfirmation字段
  8. 用户提交该前端页,它发送到API的请求的形式:用密码password_confirmation PUT/AUTH /密码参数
  9. 的API更改用户的密码和回复成功消息

我的问题发生在步骤8和9之间,我得到401未经授权的响应。这是为什么?我能做些什么来解决这个问题?

编辑:

方关于该问题的文件和线程,我意识到它与头做。然而,我不知道如何使用Ruby on Rails管理请求中的标题。

编辑2:

我设法弄清楚问题出在哪里。我需要通过访问令牌,客户端用户ID作为标题。我有机会获得这些信息,我试图通过执行以下操作来设置请求头:

http = Net::HTTP.new("127.0.0.1", "3000") 
request = Net::HTTP::Put.new("/api/v1/auth/password") 

request.add_field('uid', @@sens_pms["uid"]) 
request.add_field('client', @@sens_pms["client_id"]) 
request.add_field('access-token', @@sens_pms["token"]) 

response = http.request(request) 

然而,新的问题就来了,我这样做的时候。服务器(API)应用程序引发以下错误:

ActionDispatch::Cookies::CookieOverflow (ActionDispatch::Cookies::CookieOverflow) 

重要信息:我在开发环境中做这个(没有nginx的,只是使用WEBrick)

+0

感谢上述“EDIT2” - 我有同样的问题。它在文档中不太清楚,它们必须作为头文件以及POST参数一起发送。不幸的是,我不知道你使用的图书馆足够好,知道你正在形成这些标题的问题。我使用https://www.getpostman.com/,它可以轻松发送标题等。 – Todd

回答

-1

通过devise_token_auth请求更改密码:

  • 网址:/auth/password
  • 方法:PUT
  • 数据:passwordpassword_confirmation
  • 标题:access-token,client, uid
+0

它现在显示另一个错误**您必须填写标有'密码'和'密码确认'的字段。** – Ninja

+0

很高兴您解决了您的问题401问题。关于缺少的参数,尝试从这里调试https://github.com/lynndylanhurley/devise_token_auth/blob/master/app/controllers/devise_token_auth/passwords_controller.rb#L188你应该能够看到参数。你的请求是什么样的?随意创建更多信息的另一个问题,并将其链接到此处 –

0

好了,所以其实我克服

You must fill out the fields labeled 'Password' and 'Password confirmation 

我做了更新与header

'Authorization': 'Basic ', 
'Content-Type' : 'application/json', 
"token-type" : 'Bearer', 
'access-token' : token, 
'expiry':'XXXXX', 
'client':'XXXXX',  
'uid':'XXXXX', 

但现在的问题是它要求我输入current_password为好。在这种情况下原因在edit它不应该问current_password我们allow_password_changetrue

# allow user to change password once without current_password 
    @resource.allow_password_change = true if recoverable_enabled?