Implemented auth renewal (#5)

This commit is contained in:
Daniel J. Summers 2017-10-08 21:58:36 -05:00
parent 3acec3dc25
commit 4db6d98011
3 changed files with 56 additions and 1 deletions

View File

@ -5,6 +5,8 @@ import auth0 from 'auth0-js'
import AUTH_CONFIG from './auth0-variables' import AUTH_CONFIG from './auth0-variables'
import mutations from '@/store/mutation-types' import mutations from '@/store/mutation-types'
var tokenRenewalTimeout
export default class AuthService { export default class AuthService {
constructor () { constructor () {
@ -17,7 +19,7 @@ export default class AuthService {
auth0 = new auth0.WebAuth({ auth0 = new auth0.WebAuth({
domain: AUTH_CONFIG.domain, domain: AUTH_CONFIG.domain,
clientID: AUTH_CONFIG.clientId, clientID: AUTH_CONFIG.clientId,
redirectUri: AUTH_CONFIG.callbackUrl, redirectUri: AUTH_CONFIG.appDomain + AUTH_CONFIG.callbackUrl,
audience: `https://${AUTH_CONFIG.domain}/userinfo`, audience: `https://${AUTH_CONFIG.domain}/userinfo`,
responseType: 'token id_token', responseType: 'token id_token',
scope: 'openid profile email' scope: 'openid profile email'
@ -78,6 +80,16 @@ export default class AuthService {
}) })
} }
scheduleRenewal () {
let expiresAt = JSON.parse(localStorage.getItem('expires_at'))
let delay = expiresAt - Date.now()
if (delay > 0) {
tokenRenewalTimeout = setTimeout(() => {
this.renewToken()
}, delay)
}
}
setSession (authResult) { setSession (authResult) {
// Set the time that the access token will expire at // Set the time that the access token will expire at
let expiresAt = JSON.stringify( let expiresAt = JSON.stringify(
@ -86,10 +98,30 @@ export default class AuthService {
localStorage.setItem('access_token', authResult.accessToken) localStorage.setItem('access_token', authResult.accessToken)
localStorage.setItem('id_token', authResult.idToken) localStorage.setItem('id_token', authResult.idToken)
localStorage.setItem('expires_at', expiresAt) localStorage.setItem('expires_at', expiresAt)
this.scheduleRenewal()
}
renewToken () {
console.log('attempting renewal...')
this.auth0.renewAuth(
{
audience: `https://${AUTH_CONFIG.domain}/userinfo`,
redirectUri: `${AUTH_CONFIG.appDomain}/static/silent.html`,
usePostMessage: true
},
(err, result) => {
if (err) {
console.log(err)
} else {
this.setSession(result)
}
}
)
} }
logout (store, router) { logout (store, router) {
// Clear access token and ID token from local storage // Clear access token and ID token from local storage
clearTimeout(tokenRenewalTimeout)
localStorage.removeItem('access_token') localStorage.removeItem('access_token')
localStorage.removeItem('id_token') localStorage.removeItem('id_token')
localStorage.removeItem('expires_at') localStorage.removeItem('expires_at')

View File

@ -34,6 +34,7 @@ export default new Vuex.Store({
state: { state: {
user: JSON.parse(localStorage.getItem('user_profile') || '{}'), user: JSON.parse(localStorage.getItem('user_profile') || '{}'),
isAuthenticated: (() => { isAuthenticated: (() => {
this.auth0.scheduleRenewal()
if (this.auth0.isAuthenticated()) { if (this.auth0.isAuthenticated()) {
api.setBearer(localStorage.getItem('id_token')) api.setBearer(localStorage.getItem('id_token'))
} }

View File

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.auth0.com/js/auth0/8.9/auth0.min.js"></script>
<script>
var webAuth = new auth0.WebAuth({
domain: 'djs-consulting.auth0.com',
clientID: 'Of2s0RQCQ3mt3dwIkOBY5h85J9sXbF2n',
scope: 'openid profile email',
responseType: 'token id_token',
redirectUri: 'http://localhost:3000/static/silent.html'
})
</script>
<script>
webAuth.parseHash(window.location.hash, function (err, response) {
parent.postMessage(err || response, 'http://localhost:3000');
})
</script>
</head>
<body></body>
</html>