blob: f088f8d7cdfba704c9a0a56e3fe765af77d8af4b [file] [log] [blame]
import decode from "jwt-decode";
import {hasTokenExpired} from "../util/jwt.util";
import {custosService} from "../util/custos.util";
// const ACCESS_TOKEN_KEY = 'access_token';
// const ID_TOKEN_KEY = 'id_token';
// const REFRESH_TOKEN_KEY = 'refresh_token';
const state = {
accessToken: null,
idToken: null,
refreshToken: null
};
const actions = {
async init({commit}) {
commit("SET_TOKENS", {
accessToken: custosService.identity.accessToken,
idToken: custosService.identity.idToken,
refreshToken: custosService.identity.refreshToken
});
},
async fetchAuthorizationEndpoint(obj, {ciLogonInstitutionEntityId = null} = {}) {
const {clientId, redirectURI} = custosService;
const {data: {authorization_endpoint}} = await custosService.identity.getOpenIdConfig();
let url = `${authorization_endpoint}?response_type=code&client_id=${clientId}&redirect_uri=${redirectURI}&scope=openid`;
if (ciLogonInstitutionEntityId) {
url += `&kc_idp_hint=oidc&idphint=${ciLogonInstitutionEntityId}`;
} else {
url += `&kc_idp_hint=oidc`;
}
window.location.href = url;
},
async authenticateUsingCode({commit}, {code}) {
const {data: {access_token, id_token, refresh_token}} = await custosService.identity.getToken({code});
commit("SET_TOKENS", {accessToken: access_token, idToken: id_token, refreshToken: refresh_token});
},
async authenticateLocally({commit}, {username, password}) {
const {data: {access_token, id_token, refresh_token}} = await custosService.identity.localLogin({
username, password
});
commit("SET_TOKENS", {accessToken: access_token, idToken: id_token, refreshToken: refresh_token});
},
async logout({commit}) {
await custosService.identity.logout();
commit("CLEAR_TOKENS");
},
async refreshAuthentication({commit, state}) {
if (state.refreshToken && hasTokenExpired(state.refreshToken)) {
await custosService.identity.getTokenUsingRefreshToken()
.catch(() => commit("CLEAR_TOKENS"))
.then((res) => {
if (!res || !res.data) {
commit("CLEAR_TOKENS")
} else {
const {data: {access_token, id_token, refresh_token}} = res;
commit("SET_TOKENS", {
accessToken: access_token,
idToken: id_token,
refreshToken: refresh_token
});
}
});
}
}
}
const mutations = {
SET_TOKENS(state, {accessToken, idToken, refreshToken}) {
// custosService.identity.accessToken = accessToken;
// custosService.identity.idToken = idToken;
// custosService.identity.refreshToken = refreshToken;
state.accessToken = accessToken;
state.idToken = idToken;
state.refreshToken = refreshToken;
},
CLEAR_TOKENS(state) {
// custosService.identity.accessToken = null;
// custosService.identity.idToken = null;
// custosService.identity.refreshToken = null;
state.accessToken = null;
state.idToken = null;
state.refreshToken = null;
}
}
const getters = {
accessToken(state) {
return state.accessToken;
},
idToken(state) {
return state.idToken;
},
refreshToken(state) {
return state.refreshToken;
},
authenticated(state, getters) {
if (getters.idToken && !hasTokenExpired(state.idToken)) {
return true;
} else {
return false;
}
},
isAdmin(state, getters) {
try {
let {realm_access: {roles}} = decode(getters.accessToken);
return roles.indexOf("admin") >= 0;
} catch (err) {
return false;
}
},
currentUsername(state, getters) {
if (getters.accessToken) {
try {
let {preferred_username} = decode(getters.accessToken);
return preferred_username;
} catch (err) {
return null
}
} else {
return null
}
}
}
export default {
namespaced: true,
state,
getters,
actions,
mutations
}