portainer/app/portainer/services/authentication.js

118 lines
2.9 KiB
JavaScript

import { clear as clearSessionStorage } from './session-storage';
angular.module('portainer.app').factory('Authentication', [
'$async',
'$state',
'Auth',
'OAuth',
'jwtHelper',
'LocalStorage',
'StateManager',
'EndpointProvider',
'UserService',
'ThemeManager',
function AuthenticationFactory($async, $state, Auth, OAuth, jwtHelper, LocalStorage, StateManager, EndpointProvider, UserService, ThemeManager) {
'use strict';
var service = {};
var user = {};
service.init = init;
service.OAuthLogin = OAuthLogin;
service.login = login;
service.logout = logout;
service.isAuthenticated = isAuthenticated;
service.getUserDetails = getUserDetails;
service.isAdmin = isAdmin;
async function initAsync() {
try {
const jwt = LocalStorage.getJWT();
if (jwt) {
await setUser(jwt);
}
return !!jwt;
} catch (error) {
return false;
}
}
async function logoutAsync(performApiLogout) {
if (performApiLogout) {
await Auth.logout().$promise;
}
clearSessionStorage();
StateManager.clean();
EndpointProvider.clean();
LocalStorage.cleanAuthData();
LocalStorage.storeLoginStateUUID('');
}
function logout(performApiLogout) {
return $async(logoutAsync, performApiLogout);
}
function init() {
return $async(initAsync);
}
async function OAuthLoginAsync(code) {
const response = await OAuth.validate({ code: code }).$promise;
await setUser(response.jwt);
}
function OAuthLogin(code) {
return $async(OAuthLoginAsync, code);
}
async function loginAsync(username, password) {
const response = await Auth.login({ username: username, password: password }).$promise;
await setUser(response.jwt);
}
function login(username, password) {
return $async(loginAsync, username, password);
}
function isAuthenticated() {
var jwt = LocalStorage.getJWT();
return jwt && !jwtHelper.isTokenExpired(jwt);
}
function getUserDetails() {
return user;
}
async function setUserTheme() {
const data = await UserService.user(user.ID);
// Initialize user theme base on Usertheme from database
const userTheme = data.UserTheme;
if (userTheme === 'auto' || !userTheme) {
ThemeManager.autoTheme();
} else {
ThemeManager.setTheme(userTheme);
}
}
async function setUser(jwt) {
LocalStorage.storeJWT(jwt);
var tokenPayload = jwtHelper.decodeToken(jwt);
user.username = tokenPayload.username;
user.ID = tokenPayload.id;
user.role = tokenPayload.role;
user.forceChangePassword = tokenPayload.forceChangePassword;
await setUserTheme();
}
function isAdmin() {
if (user.role === 1) {
return true;
}
return false;
}
return service;
},
]);