我有一个使用 devise 和 devise_token_auth gem 的 rails 4 应用程序。我希望我的 rails 应用程序正常使用设计来处理 html 请求,并使用 devise_token_auth 来检索访问令牌。以上所有工作正常。
现在,从我的 REST 客户端,我想使用 access_token 标头来检索 html 根页面。
在我的 application_controller 中,如果我添加以下行:
include DeviseTokenAuth::Concerns::SetUserByToken
带有访问令牌标头的 RESTClient 对主页的请求工作正常,并将用户重定向到登录页面。但是,当我尝试通过浏览器中的设计登录和注册时,无论我在哪里使用 user_signed_in,都会出现错误?和其他设计方法。
如果我从 application_controller 中删除上述行,则所有具有常规登录和注册的浏览器调用都可以正常工作(带有相关重定向),但我无法通过设置 access_token 标头从 REST 客户端获取主页。
这是根控制器代码:
home_controller.rb
def index
if user_signed_in?
redirect_to logged_in_path
end
end
以下是请求和响应:
1:应用程序控制器中存在 SetUserByToken 行
1.1 来自 RESTClient:
Url: http://10.0.1.15:3000
Method: GET
Request Headers:
Access-Token: aaaaaaaaaaa
Token-Type: Bearer
Client: bbbbbbbbbbbb
Expiry: 1234567
Uid: foo@bar.com
Response: 200 Ok
<Redirected to member home page>
1.2 来自网页
Error where user_signed_in? is called
2:在 application_controller 中使用 SetUserByToken 行未设置
2.1 来自 RESTClient:
Url: http://10.0.1.15:3000
Method: GET
Request Headers:
Access-Token: aaaaaaaaaaa
Token-Type: Bearer
Client: bbbbbbbbbbbb
Expiry: 1234567
Uid: foo@bar.com
Response: 200 Ok
<NO REDIRECT to member home page> (user_signed_in? in the index action returns false)
2.2 从网页
<Can login, gets redirected to logged in page>
如何让网站在常规浏览器和 REST 客户端中都能正常工作?
实际目标是拥有一个 android 客户端应用程序(而不是 REST 客户端,一旦解决此问题),用户通过输入电子邮件和密码从本机代码登录,如果成功返回访问令牌,则切换到显示 WebView 的活动,该 WebView 加载与用户登录的会话。在 WebView 中,用户保持登录状态并可以浏览所有页面。如果用户从本机客户端注销,则访问令牌将被丢弃,并且用户也会从服务器会话中注销。