7d0b573d37
- OPID_PROFILE_SCREEN_PROVIDER is a variable to show profile of user connected. You can defined your own provider or use classic provider of WorkAdventure. - OpenIdProfileController with url "/profile" get user data and create simple html to show user informations. This url will be called with params 'accessToken' - If you define your custom profile url, it will be called with param 'accessToken'. accessToken is token to access at user informations in your OpenId provider.
81 lines
3 KiB
TypeScript
81 lines
3 KiB
TypeScript
import { BaseController } from "./BaseController";
|
|
import { HttpRequest, HttpResponse, TemplatedApp } from "uWebSockets.js";
|
|
import { parse } from "query-string";
|
|
import { openIDClient } from "../Services/OpenIDClient";
|
|
import { AuthTokenData, jwtTokenManager } from "../Services/JWTTokenManager";
|
|
import { adminApi } from "../Services/AdminApi";
|
|
import { OPID_CLIENT_ISSUER } from "../Enum/EnvironmentVariable";
|
|
import { IntrospectionResponse } from "openid-client";
|
|
|
|
export class OpenIdProfileController extends BaseController {
|
|
constructor(private App: TemplatedApp) {
|
|
super();
|
|
this.profileOpenId();
|
|
}
|
|
|
|
profileOpenId() {
|
|
//eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
this.App.get("/profile", async (res: HttpResponse, req: HttpRequest) => {
|
|
res.onAborted(() => {
|
|
console.warn("/message request was aborted");
|
|
});
|
|
|
|
const { accessToken } = parse(req.getQuery());
|
|
if (!accessToken) {
|
|
throw Error("Access token expected cannot to be check on Hydra");
|
|
}
|
|
try {
|
|
const resCheckTokenAuth = await openIDClient.checkTokenAuth(accessToken as string);
|
|
if (!resCheckTokenAuth.email) {
|
|
throw "Email was not found";
|
|
}
|
|
res.end(
|
|
this.buildHtml(
|
|
OPID_CLIENT_ISSUER,
|
|
resCheckTokenAuth.email as string,
|
|
resCheckTokenAuth.picture as string | undefined
|
|
)
|
|
);
|
|
} catch (error) {
|
|
console.error("profileCallback => ERROR", error);
|
|
this.errorToResponse(error, res);
|
|
}
|
|
});
|
|
}
|
|
|
|
buildHtml(domain: string, email: string, pictureUrl?: string) {
|
|
return (
|
|
"<!DOCTYPE html>" +
|
|
`
|
|
<header>
|
|
<style>
|
|
*{
|
|
font-family: PixelFont-7, monospace;
|
|
}
|
|
body{
|
|
text-align: center;
|
|
color: white;
|
|
}
|
|
section{
|
|
margin: 20px;
|
|
}
|
|
</style>
|
|
</header>
|
|
<body>
|
|
<div class="container">
|
|
<section>
|
|
<img src="${pictureUrl ? pictureUrl : "/images/profile"}">
|
|
</section>
|
|
<section>
|
|
Profile validated by domain: <span style="font-weight: bold">${domain}</span>
|
|
</section>
|
|
<section>
|
|
Your email: <span style="font-weight: bold">${email}</span>
|
|
</section>
|
|
</div>
|
|
</body>
|
|
`
|
|
);
|
|
}
|
|
}
|