Reputation: 2343
I have a requirement that I can append ?auth_token=x
to any URL in my app and it will restore the session as if you had a cookie or the details were stored in local storage.
I've tried every manner I can think of to implement this over the last few hours but I'm not getting anywhere. Is this possible? Where should I be looking to add such functionality?
Upvotes: 1
Views: 489
Reputation: 4062
I'm not sure I understand what you're doing. It seems like you're restoring the session from an auth token in the query string? That's actually what the authenticator's restore
method is for (see docs here: http://ember-simple-auth.simplabs.com/ember-simple-auth-devise-api-docs.html#Ember-SimpleAuth-Authenticators-Devise-restore). Also when the application starts isn't the query string empty?
Upvotes: 0
Reputation: 2343
I'm answering my own question here as I managed to find a solution, although how correct it is I'm not sure!
application.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);
initializers/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'
Upvotes: 1