我有一个要求,我可以附加?auth_token=x
到我的应用程序中的任何 URL,它会恢复会话,就好像你有一个 cookie 或详细信息存储在本地存储中一样。
在过去的几个小时里,我已经尝试了所有我能想到的方式来实现这一点,但我没有得到任何结果。这可能吗?我应该在哪里添加这样的功能?
我有一个要求,我可以附加?auth_token=x
到我的应用程序中的任何 URL,它会恢复会话,就好像你有一个 cookie 或详细信息存储在本地存储中一样。
在过去的几个小时里,我已经尝试了所有我能想到的方式来实现这一点,但我没有得到任何结果。这可能吗?我应该在哪里添加这样的功能?
我在这里回答我自己的问题,因为我设法找到了一个解决方案,虽然我不确定它有多正确!
应用程序.js:
// Really simple query parameter access
(function($) {
$.QueryString = (function(a) {
if (a == "") return {};
var b = {};
for (var i = 0; i < a.length; ++i)
{
var p=a[i].split('=');
if (p.length != 2) continue;
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
}
return b;
})(window.location.search.substr(1).split('&'))
})(jQuery);
初始化程序/authentication.js.coffee:
LocalStorageWithURLAuth = Ember.SimpleAuth.Stores.LocalStorage.extend
init: ->
if $.QueryString['auth_token']
auth_token = $.QueryString['auth_token']
Ember.$.ajax(
async: false
url: '/users/sign_in'
type: 'POST'
data: { auth_token: auth_token }
dataType: 'json'
).then (data) =>
@persist
auth_token: data.auth_token
auth_email: data.auth_email
user_id: data.user_id
authenticatorFactory: 'authenticator:devise'
@_super()
, (error) =>
@_super()
else
@_super()
Ember.Application.initializer
name: 'authentication'
initialize: (container, application) ->
Ember.SimpleAuth.Session.reopen
user: (->
userId = @get 'user_id'
if !Ember.isEmpty userId
container.lookup('store:main').find 'user', userId
).property('user_id')
container.register 'session-store:local-storage-url', LocalStorageWithURLAuth
Ember.SimpleAuth.setup container, application,
storeFactory: 'session-store:local-storage-url'
authenticatorFactory: 'authenticator:devise'
authorizerFactory: 'authorizer:devise'
我不确定我明白你在做什么。您似乎正在从查询字符串中的身份验证令牌恢复会话?这实际上就是验证器的restore
方法(请参阅此处的文档:http: //ember-simple-auth.simplabs.com/ember-simple-auth-devise-api-docs.html#Ember-SimpleAuth-Authenticators-Devise-restore)。另外,当应用程序启动时,查询字符串不是空的吗?