refactor auth

This commit is contained in:
Konstantin Haase 2012-12-16 16:57:12 +01:00
parent ab0cb7d432
commit 368ef859ea
2 changed files with 34 additions and 73 deletions

View File

@ -40,7 +40,7 @@ Travis.reopen
@get('auth').storeAfterSignInPath(path)
autoSignIn: (path) ->
@get('auth').autoSignIn(path)
@get('auth').autoSignIn()
signIn: ->
@get('auth').signIn()

View File

@ -1,91 +1,55 @@
@Travis.Auth = Ember.Object.extend
iframe: $('<iframe id="auth-frame" />').hide()
timeout: 30000 # api has a lower timeout for opening a popup
state: 'signed-out'
state: "signed-out"
receivingEnd: "#{location.protocol}//#{location.host}"
init: ->
@iframe.appendTo('body')
window.addEventListener('message', (e) => @receiveMessage(e))
accessToken: (->
Travis.sessionStorage.getItem('travis.token')
).property()
# if the user is in the session storage, we're using it. if we have a flag
# for auto signin then we're trying to sign in.
autoSignIn: (path) ->
console.log 'autoSignIn'
global = Travis.storage.getItem('travis.user')
session = Travis.sessionStorage.getItem('travis.user')
user = session || global
if @validateUser(user)
Travis.storage.setItem('travis.user', user) unless global
data = JSON.parse(user)
data = { user: data } unless data.user?
@setData(data)
else if Travis.storage.getItem('travis.auto_signin')
console.log 'travis.auto_signin', Travis.storage.getItem('travis.auto_signin')
Travis.storage.setItem('travis.auto_signin', false)
@signIn()
validateUser: (user) ->
return false unless typeof user == 'string'
user = JSON.parse(user)
user.id && user.login && user.token
# try signing in, but check later in case we have a timeout
signIn: () ->
console.log 'set state, signing-in'
@set('state', 'signing-in')
@trySignIn()
Ember.run.later(this, @checkSignIn.bind(this), @timeout)
signOut: ->
Travis.storage.removeItem('travis.auto_signin')
Travis.storage.removeItem('travis.locale')
Travis.storage.removeItem('travis.user')
Travis.storage.removeItem('travis.token')
Travis.sessionStorage.clear()
Travis.setLocale Travis.default_locale
@setData()
@set('state', 'signed-out')
@set('user', undefined)
trySignIn: ->
console.log 'trySignIn', "#{@endpoint}/auth/post_message?origin=#{@receivingEnd}"
@iframe.attr('src', "#{@endpoint}/auth/post_message?origin=#{@receivingEnd}")
signIn: ->
@set('state', 'signing-in')
url = "#{@endpoint}/auth/post_message?origin=#{@receivingEnd}"
$('<iframe id="auth-frame" />').hide().appendTo('body').attr('src', url)
checkSignIn: ->
@forceSignIn() if @get('state') == 'signing-in'
autoSignIn: ->
data = @userDataFrom(Travis.sessionStorage) || @userDataFrom(Travis.storage)
@setData(data) if data
forceSignIn: ->
console.log 'forceSignIn'
Travis.storage.setItem('travis.auto_signin', 'true')
window.location = "#{@endpoint}/auth/handshake?redirect_uri=#{location}"
userDataFrom: (storage) ->
user = JSON.parse storage.getItem('travis.user')
token = storage.getItem('travis.token')
if user && token && validateUser(user)
{ user: user, token: token }
else
storage.removeItem('travis.user')
storage.removeItem('travis.token')
null
validateUser: (user) ->
user.id && user.login && user.token
# TODO should have clearData() to clean this up
setData: (data) ->
data = JSON.parse(data) if typeof data == 'string'
@storeToken(data?.token)
user = @storeUser(data.user) if data?.user
@set('state', if user then 'signed-in' else 'signed-out')
@set('user', if user then user else undefined)
@afterSignIn(data.user) if data?.user
afterSignIn: (user) ->
Travis.setLocale user.locale || Travis.default_locale
Travis.trigger('user:signed_in', user)
@storeData(data, Travis.sessionStorage)
@storeData(data, Travis.storage) unless @userDataFrom(Travis.storage)
@set('user', @loadUser(data.user))
@set('state', 'signed-in')
Travis.setLocale(data.user.locale || Travis.default_locale)
Travis.trigger('user:signed_in', data.user)
@get('app.router').send('afterSignIn', @readAfterSignInPath())
storeToken: (token) ->
token = token || Travis.storage.getItem('travis.token')
if token
Travis.storage.setItem('travis.token', token)
Travis.sessionStorage.setItem('travis.token', token)
@notifyPropertyChange('accessToken')
storeData: (data, storage) ->
storage.setItem('travis.token', data.token)
storage.setItem('travis.user', JSON.stringify(user))
storeUser: (user) ->
Travis.storage.setItem('travis.auto_signin', 'true')
Travis.sessionStorage.setItem('travis.user', JSON.stringify(user))
loadUser: (user) ->
@app.store.load(Travis.User, user)
user = @app.store.find(Travis.User, user.id)
user.get('permissions')
@ -102,13 +66,10 @@
receiveMessage: (event) ->
if event.origin == @expectedOrigin()
if event.data == 'redirect'
@forceSignIn()
window.location = "#{@endpoint}/auth/handshake?redirect_uri=#{location}"
else if event.data.user?
event.data.user.token = event.data.travis_token if event.data.travis_token
@setData(event.data)
console.log("signed in as #{event.data.user.login}")
else
console.log("unexpected message #{event.origin}: #{event.data}")
expectedOrigin: ->
if @endpoint[0] == '/' then @receivingEnd else @endpoint