Completely getting rid of "userid"

Previously, userid was generated by the "/login" route and passed along.
This commit completely removes the uuid "userid" (and disables the LoginController too and any Jwt check).

"userid" is replaced by the "socket id" of the connection.
So a user is now identified using a socket id, which is unique for a given connection.
This commit is contained in:
David Négrier 2020-05-14 23:19:48 +02:00
parent 76b43245c5
commit 4de552437d
13 changed files with 130 additions and 84 deletions

View file

@ -18,7 +18,8 @@ enum EventMessage{
GROUP_DELETE = "group-delete",
CONNECT_ERROR = "connect_error",
RECONNECT = "reconnect"
RECONNECT = "reconnect",
ATTRIBUTE_USER_ID = "attribute-user-id" // Sent from server to client just after the connexion is established to give the client its unique id.
}
class Message {
@ -184,25 +185,37 @@ export class Connexion implements ConnexionInterface {
* @param characterSelected
*/
createConnexion(characterSelected: string): Promise<ConnexionInterface> {
return Axios.post(`${API_URL}/login`, {email: this.email})
/*return Axios.post(`${API_URL}/login`, {email: this.email})
.then((res) => {
this.token = res.data.token;
this.userId = res.data.userId;
this.userId = res.data.userId;*/
this.socket = SocketIo(`${API_URL}`, {
query: {
/*query: {
token: this.token
}
}*/
});
this.connectSocketServer();
return res.data;
// TODO: maybe trigger promise only when connexion is established?
let promise = new Promise<ConnexionInterface>((resolve, reject) => {
/*console.log('PROMISE CREATED')
this.socket.on('connection', () => {
console.log('CONNECTED');
resolve(this);
});*/
resolve(this);
});
return promise;
/* return res.data;
})
.catch((err) => {
console.error(err);
throw err;
});
});*/
}
/**
@ -229,6 +242,7 @@ export class Connexion implements ConnexionInterface {
}
//listen event
this.attributeUserId();
this.positionOfAllUser();
this.disconnectServer();
this.errorMessage();
@ -286,6 +300,15 @@ export class Connexion implements ConnexionInterface {
this.socket.emit(EventMessage.USER_POSITION, messageUserPosition.toString());
}
attributeUserId(): void {
// This event is received as soon as the connexion is established.
// It allows informing the browser of its own user id.
this.socket.on(EventMessage.ATTRIBUTE_USER_ID, (userId: string) => {
console.log('Received my user id: ', userId);
this.userId = userId;
});
}
/**
* The data sent is an array with information for each user :
* [

View file

@ -67,7 +67,7 @@ export class GameManager {
*/
createCurrentPlayer(): void {
//Get started room send by the backend
this.currentGameScene.createCurrentPlayer(this.ConnexionInstance.userId);
this.currentGameScene.createCurrentPlayer();
this.status = StatusGameManagerEnum.CURRENT_USER_CREATED;
}
@ -119,6 +119,10 @@ export class GameManager {
return this.playerName;
}
getPlayerId(): string {
return this.ConnexionInstance.userId;
}
getCharacterSelected(): string {
return this.characterUserSelected;
}

View file

@ -15,7 +15,7 @@ export enum Textures {
export interface GameSceneInterface extends Phaser.Scene {
Map: Phaser.Tilemaps.Tilemap;
createCurrentPlayer(UserId : string) : void;
createCurrentPlayer() : void;
shareUserPosition(UsersPosition : Array<MessageUserPositionInterface>): void;
shareGroupPosition(groupPositionMessage: GroupCreatedUpdatedMessageInterface): void;
updateOrCreateMapPlayer(UsersPosition : Array<MessageUserPositionInterface>): void;
@ -266,11 +266,11 @@ export class GameScene extends Phaser.Scene implements GameSceneInterface, Creat
})
}
createCurrentPlayer(UserId : string){
createCurrentPlayer(){
//initialise player
//TODO create animation moving between exit and strat
this.CurrentPlayer = new Player(
UserId,
null, // The current player is not has no id (because the id can change if connexion is lost and we should check that id using the GameManager.
this,
this.startX,
this.startY,
@ -347,9 +347,11 @@ export class GameScene extends Phaser.Scene implements GameSceneInterface, Creat
return;
}
let currentPlayerId = this.GameManager.getPlayerId();
//add or create new user
UsersPosition.forEach((userPosition : MessageUserPositionInterface) => {
if(userPosition.userId === this.CurrentPlayer.userId){
if(userPosition.userId === currentPlayerId){
return;
}
let player = this.findPlayerInMap(userPosition.userId);

View file

@ -90,7 +90,7 @@ export class LogincScene extends Phaser.Scene implements GameSceneInterface {
});
/*create user*/
this.createCurrentPlayer("test");
this.createCurrentPlayer();
cypressAsserter.initFinished();
}
@ -144,7 +144,7 @@ export class LogincScene extends Phaser.Scene implements GameSceneInterface {
throw new Error("Method not implemented.");
}
createCurrentPlayer(UserId: string): void {
createCurrentPlayer(): void {
for (let i = 0; i <PLAYER_RESOURCES.length; i++) {
let playerResource = PLAYER_RESOURCES[i];
let player = this.physics.add.sprite(playerResource.x, playerResource.y, playerResource.name, playerResource.name);

View file

@ -7,7 +7,6 @@ import {PlayableCaracter} from "../Entity/PlayableCaracter";
export const hasMovedEventName = "hasMoved";
export interface CurrentGamerInterface extends PlayableCaracter{
userId : string;
initAnimation() : void;
moveUser(delta: number) : void;
say(text : string) : void;