我在Ember-cli应用中使用Ember Simple Auth Devise v 0.6.4。
我可以正常登录但是当我刷新页面时会话丢失。 (在Firefox和Chrome中测试过。)
登录后,检查localStorage会显示会话,刷新localStorage后为空。
以下是我登录时本地存储空间中的内容:
答案 0 :(得分:10)
问题是会话中的user_token
和user_email
都没有进行身份验证所需的会话。因此,只要您重新加载页面,验证者的restore
method就会拒绝该会话。如果没有user_token
和user_email
,authorizer也不会实际授权任何请求。
您需要将服务器端设备设置更改为described here。
答案 1 :(得分:2)
我遇到了与simple-auth-devise相同的问题。
问题在于config/environment.js
identificationAttributeName
被覆盖了。
ENV['simple-auth-devise'] = {
identificationAttributeName: 'email'
};
通过这样做,它不再匹配Users::SessionsController
成功验证时返回的数据,取自ember-simple-auth-devise自述文件:
data = {
token: user.authentication_token,
user_email: user.email
}
属性名称必须匹配,因此解决方案是使用控制器返回的JSON中的identificationAttributeName
:
data = {
token: user.authentication_token,
email: user.email
}
就像marcoow所指出的那样,所有这些都是在Devise授权器restore()
方法的实现中。
答案 2 :(得分:0)
我遇到了同样的问题,例如我的会议正在刷新。
这是不受欢迎的行为,对我而言,至少似乎与服务器端设备设置无关。
没有请求被发送到服务器,只是通过使用应首先检查的cookie来保持会话活跃。
答案 3 :(得分:0)
我也有这个问题。事实证明,身份验证器中的还原方法没有考虑资源名称。
如下:
if (!Ember.isEmpty(propertiesObject.get(_this.resourceName)[_this.tokenAttributeName]) && !Ember.isEmpty(propertiesObject.get(_this.resourceName)[_this.identificationAttributeName])) {
解决了这个问题。
请注意,我的本地存储空间如下:
{"secure":{"authenticator":"simple-auth-authenticator:devise","user":{"id":1,"email":"test@gmail.com","created_at":"2015-07-20T22:30:47.966Z","updated_at":"2015-07-23T17:45:41.874Z","authentication_token":"7Uv6LysQ2h3x-P4WUMmU","token":"7Uv6LysQ2h3x-P4WUMmU"}}}
因此,这需要config / environment.js
中的其他更改 ENV['simple-auth-devise'] = {
identificationAttributeName: 'email',
resourceName: 'user',
tokenAttributeName: 'authentication_token',
crossOriginWhitelist: ['*']
};
更改bower_components / ember-simple-auth / simple-auth-devise.amd.js让我看到这确实是我的问题。