account-claim #98

Merged
Ajdj100 merged 7 commits from account-claim into main 2025-12-14 21:52:23 -06:00
2 changed files with 43 additions and 15 deletions
Showing only changes of commit a6002dadb5 - Show all commits

View File

@@ -10,10 +10,14 @@ import { Role } from '@app/shared/types/roles';
import pool from '../db'; import pool from '../db';
import { requireLogin } from '../middleware/auth'; import { requireLogin } from '../middleware/auth';
import { getUserRoles } from '../services/rolesService'; import { getUserRoles } from '../services/rolesService';
import { getUserState } from '../services/memberService'; import { getUserState, mapDiscordtoID } from '../services/memberService';
import { MemberState } from '@app/shared/types/member'; import { MemberState } from '@app/shared/types/member';
import { toDateTime } from '@app/shared/utils/time';
const querystring = require('querystring'); const querystring = require('querystring');
function parseJwt(token) {
return JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());
}
passport.use(new OpenIDConnectStrategy({ passport.use(new OpenIDConnectStrategy({
issuer: process.env.AUTH_ISSUER, issuer: process.env.AUTH_ISSUER,
@@ -29,10 +33,11 @@ passport.use(new OpenIDConnectStrategy({
console.log('--- OIDC verify() called ---'); console.log('--- OIDC verify() called ---');
console.log('issuer:', issuer); console.log('issuer:', issuer);
console.log('sub:', sub); console.log('sub:', sub);
console.log('params:', params); // console.log('discord:', discord);
console.log('profile:', profile); console.log('profile:', profile);
console.log('id_token claims:', JSON.stringify(jwtClaims, null, 2)); console.log('jwt: ', parseJwt(jwtClaims));
console.log('preferred_username:', jwtClaims?.preferred_username); console.log('params:', params);
try { try {
var con = await pool.getConnection(); var con = await pool.getConnection();
@@ -47,14 +52,33 @@ passport.use(new OpenIDConnectStrategy({
memberId = existing[0].id; memberId = existing[0].id;
} else { } else {
//otherwise: create account //otherwise: create account
const username = sub.username; const jwt = parseJwt(jwtClaims);
const discordID = jwt.discord.id as number;
const result = await con.query( //check if account is available to claim
`INSERT INTO members (name, authentik_sub, authentik_issuer) VALUES (?, ?, ?)`, let memberId = await mapDiscordtoID(discordID);
[username, sub, issuer]
) if (memberId === null) {
memberId = Number(result.insertId); console.log('new account');
// create new account
const username = sub.username;
const result = await con.query(
`INSERT INTO members (name, authentik_sub, authentik_issuer) VALUES (?, ?, ?)`,
[username, sub, issuer]
)
memberId = Number(result.insertId);
} else {
console.log('claim account');
// claim existing account
const result = await con.query(
`UPDATE members SET authentik_sub = ?, authentik_issuer = ? WHERE id = ?;`,
[sub, issuer, memberId]
)
}
} }
await con.query(`UPDATE members SET last_login = ? WHERE id = ?`, [toDateTime(new Date()), memberId])
await con.commit(); await con.commit();
return cb(null, { memberId }); return cb(null, { memberId });
} catch (error) { } catch (error) {
@@ -116,11 +140,10 @@ passport.deserializeUser(function (user, cb) {
var userData: { id: number, name: string, roles: Role[], state: MemberState }; var userData: { id: number, name: string, roles: Role[], state: MemberState };
try { try {
var con = await pool.getConnection(); var con = await pool.getConnection();
let userResults = await con.query(`SELECT id, name FROM members WHERE id = ?;`, [memberID]) let userResults = await con.query(`SELECT id, name FROM members WHERE id = ?;`, [memberID])
userData = userResults[0]; userData = userResults[0];
let userRoles = await getUserRoles(memberID); let userRoles = await getUserRoles(memberID);
userData.roles = userRoles; userData.roles = userRoles || [];
userData.state = await getUserState(memberID); userData.state = await getUserState(memberID);
} catch (error) { } catch (error) {
console.error(error) console.error(error)

View File

@@ -15,9 +15,8 @@ export async function setUserState(userID: number, state: MemberState) {
} }
export async function getUserState(user: number): Promise<MemberState> { export async function getUserState(user: number): Promise<MemberState> {
let out = await pool.query(`SELECT state FROM members WHERE id = ?`, [user]); let out = await pool.query(`SELECT state FROM members WHERE id = ?`, [user]);
console.log('hi') return (out[0].state as MemberState);
return (out[0].state as MemberState);
} }
export async function getMemberSettings(id: number): Promise<memberSettings> { export async function getMemberSettings(id: number): Promise<memberSettings> {
@@ -54,4 +53,10 @@ export async function getMembersFull(ids: number[]): Promise<Member[]> {
const sql = `SELECT * FROM view_member_rank_unit_status_latest WHERE member_id IN (?);`; const sql = `SELECT * FROM view_member_rank_unit_status_latest WHERE member_id IN (?);`;
const res: Member[] = await pool.query(sql, [ids]); const res: Member[] = await pool.query(sql, [ids]);
return res; return res;
}
export async function mapDiscordtoID(id: number): Promise<number | null> {
const sql = `SELECT id FROM members WHERE discord_id = ?;`
let res = await pool.query(sql, [id]);
return res.length > 0 ? res[0].id : null;
} }