Merge pull request #1590 from thecodingmachine/FixHashLocalStorage

Fix htag last map URL visited in localstorage
This commit is contained in:
grégoire parant 2021-11-24 19:43:48 +01:00 committed by GitHub
commit a59c07d8a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 8 deletions

View File

@ -176,8 +176,9 @@ class ConnectionManager {
//before set token of user we must load room and all information. For example the mandatory authentication could be require on current room //before set token of user we must load room and all information. For example the mandatory authentication could be require on current room
this._currentRoom = await Room.createRoom(new URL(roomPath)); this._currentRoom = await Room.createRoom(new URL(roomPath));
//defined last room url this room path //Set last room visited! (connected or nor, must to be saved in localstorage and cache API)
localUserStore.setLastRoomUrl(this._currentRoom.key); //use href to keep # value
localUserStore.setLastRoomUrl(this._currentRoom.href);
//todo: add here some kind of warning if authToken has expired. //todo: add here some kind of warning if authToken has expired.
if (!this.authToken && !this._currentRoom.authenticationMandatory) { if (!this.authToken && !this._currentRoom.authenticationMandatory) {
@ -188,10 +189,17 @@ class ConnectionManager {
analyticsClient.loggedWithSso(); analyticsClient.loggedWithSso();
} catch (err) { } catch (err) {
console.error(err); console.error(err);
//if user must to be connect in current room or pusher error is not openid provier access error
//try to connected with function loadOpenIDScreen
if (
this._currentRoom.authenticationMandatory ||
(err.response?.data && err.response.data !== "User cannot to be connected on openid provier")
) {
this.loadOpenIDScreen(); this.loadOpenIDScreen();
return Promise.reject(new Error("You will be redirect on login page")); return Promise.reject(new Error("You will be redirect on login page"));
} }
} }
}
this.localUser = localUserStore.getLocalUser() as LocalUser; //if authToken exist in localStorage then localUser cannot be null this.localUser = localUserStore.getLocalUser() as LocalUser; //if authToken exist in localStorage then localUser cannot be null
if (this._currentRoom.textures != undefined && this._currentRoom.textures.length > 0) { if (this._currentRoom.textures != undefined && this._currentRoom.textures.length > 0) {

View File

@ -176,6 +176,10 @@ export class Room {
return newUrl.toString(); return newUrl.toString();
} }
public get href(): string {
return this.roomUrl.toString();
}
get textures(): CharacterTexture[] | undefined { get textures(): CharacterTexture[] | undefined {
return this._textures; return this._textures;
} }

View File

@ -45,6 +45,7 @@ export class GameManager {
return EnableCameraSceneName; return EnableCameraSceneName;
} else { } else {
this.activeMenuSceneAndHelpCameraSettings(); this.activeMenuSceneAndHelpCameraSettings();
//TODO fix to return href with # saved in localstorage
return this.startRoom.key; return this.startRoom.key;
} }
} }

View File

@ -40,7 +40,8 @@ class UrlManager {
public pushRoomIdToUrl(room: Room): void { public pushRoomIdToUrl(room: Room): void {
if (window.location.pathname === room.id) return; if (window.location.pathname === room.id) return;
//Set last room visited! (connected or nor, must to be saved in localstorage and cache API) //Set last room visited! (connected or nor, must to be saved in localstorage and cache API)
localUserStore.setLastRoomUrl(room.key); //use href to keep # value
localUserStore.setLastRoomUrl(room.href);
const hash = window.location.hash; const hash = window.location.hash;
const search = room.search.toString(); const search = room.search.toString();
history.pushState({}, "WorkAdventure", room.id + (search ? "?" + search : "") + hash); history.pushState({}, "WorkAdventure", room.id + (search ? "?" + search : "") + hash);

View File

@ -5,7 +5,7 @@ import { adminApi, FetchMemberDataByUuidResponse } from "../Services/AdminApi";
import { AuthTokenData, jwtTokenManager } from "../Services/JWTTokenManager"; import { AuthTokenData, jwtTokenManager } from "../Services/JWTTokenManager";
import { parse } from "query-string"; import { parse } from "query-string";
import { openIDClient } from "../Services/OpenIDClient"; import { openIDClient } from "../Services/OpenIDClient";
import { DISABLE_ANONYMOUS } from "../Enum/EnvironmentVariable"; import { DISABLE_ANONYMOUS, FRONT_URL } from "../Enum/EnvironmentVariable";
export interface TokenInterface { export interface TokenInterface {
userUuid: string; userUuid: string;
@ -80,7 +80,11 @@ export class AuthenticateController extends BaseController {
this.addCorsHeaders(res); this.addCorsHeaders(res);
return res.end(JSON.stringify({ ...resUserData, authToken: token })); return res.end(JSON.stringify({ ...resUserData, authToken: token }));
} }
throw Error("Token cannot to be check on Hydra"); console.error("Token cannot to be check on OpenId provider");
res.writeStatus("500");
res.writeHeader("Access-Control-Allow-Origin", FRONT_URL);
res.end("User cannot to be connected on openid provier");
return;
} }
const resCheckTokenAuth = await openIDClient.checkTokenAuth(authTokenData.accessToken); const resCheckTokenAuth = await openIDClient.checkTokenAuth(authTokenData.accessToken);
@ -93,7 +97,17 @@ export class AuthenticateController extends BaseController {
} }
//user have not token created, check data on hydra and create token //user have not token created, check data on hydra and create token
const userInfo = await openIDClient.getUserInfo(code as string, nonce as string); let userInfo = null;
try {
userInfo = await openIDClient.getUserInfo(code as string, nonce as string);
} catch (err) {
//if no access on openid provider, return error
console.error("User cannot to be connected on OpenId provider => ", err);
res.writeStatus("500");
res.writeHeader("Access-Control-Allow-Origin", FRONT_URL);
res.end("User cannot to be connected on openid provier");
return;
}
const email = userInfo.email || userInfo.sub; const email = userInfo.email || userInfo.sub;
if (!email) { if (!email) {
throw new Error("No email in the response"); throw new Error("No email in the response");