account-claim #98
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user