设计令牌认证给予陈旧的令牌

时间:2016-01-30 17:23:13

标签: ruby-on-rails ruby angularjs devise

我花了很长时间试图解决这个问题,谷歌一直没有帮助。我在客户端使用带有ng-token-auth的devise-token-auth gem来进行令牌认证,并且在登录后它一直给我一个陈旧的令牌。具体而言,即使返回新令牌并将其存储在cookie中,也会为用户使用最后一个令牌。为了让事情变得更加令人困惑,如果我刷新页面,我会突然得到正确的令牌,并且身份验证按预期工作。这一切都在上周工作得很好,所以我对自己所做的改变有点可能导致这种情况发生。有没有人在此之前或现在看到这个是什么造成的。它让我疯了。

初​​始化/ devise_token_auth.rb

DeviseTokenAuth.setup do |config|
    config.change_headers_on_each_request = false
    config.default_confirm_success_url = "confirmed"
    remove_tokens_after_password_reset = true
    config.token_lifespan = 24.hours
end

的routes.rb

  mount_devise_token_auth_for 'User', at: 'api/auth'

我真的不确定是怎么回事,或者为什么这样折磨我。任何帮助是极大的赞赏。如果有任何我没有提供的代码可以帮助回答这个问题,请告诉我。

1 个答案:

答案 0 :(得分:1)

我不确定这是否是解决此问题的最佳方法,但我设法通过注入ipCookies在客户端修复它,如果请求配置标头为空则检查使用它。登录后,配置将为null,但cookie将存在。因此,为了防止任何问题,我还检查cookie是否存在,如果存在,那么我使用它们。我不确定我喜欢这个解决方案,但它确实有用。

var injector = angular.injector(['ipCookie']);
var cookies = injector.get('ipCookie');
var auth_headers = cookies('auth_headers');

if ((config.headers['access-token'] || auth_headers['access-token']) && !$httpProvider.defaults.headers.common['access-token']) {
    $httpProvider.defaults.headers.common['Access-Token'] = config.headers['access-token'] || auth_headers['access-token'];
    $httpProvider.defaults.headers.common['Token-Type'] = config.headers['token-type'] || auth_headers['token-type'];
    $httpProvider.defaults.headers.common['Client'] = config.headers['client'] || auth_headers['client'];
    $httpProvider.defaults.headers.common['Expiry'] = config.headers['expiry'] || auth_headers['expiry'];
    $httpProvider.defaults.headers.common['Uid'] = config.headers['uid'] || auth_headers['uid'];
}