fix: fix no-auth redirects for discourse SSO

This commit is contained in:
mrjvs
2026-08-12 16:56:34 +02:00
parent 437c48588a
commit ae0b1aaaa1
5 changed files with 14 additions and 8 deletions

View File

@@ -105,7 +105,7 @@ Miscellanous tasks:
- [x] Discord role syncing
- [x] Login/logout
- [x] Register
- [ ] Discourse SSO
- [x] Discourse SSO
- [ ] HCaptcha
- [ ] RSS feed
- [ ] Stripe checkout

View File

@@ -1,4 +1,5 @@
import { createHmac } from 'node:crypto';
import { ClientError } from 'nice-grpc';
import type { GetUserDataResponse } from '@pretendonetwork/grpc/api/get_user_data_rpc';
function getDicourseSignature(secret: string, payload: string) {
@@ -33,17 +34,24 @@ export default defineEventHandler(async (event) => {
let userData: GetUserDataResponse | null = null;
if (accessTokenCookie) {
const grpc = useApiGrpcWithToken(event, accessTokenCookie);
userData = await grpc.getUserData({});
try {
userData = await grpc.getUserData({});
} catch (err: unknown) {
const isTokenError = err instanceof ClientError && err.details === 'UNAUTHENTICATED: Missing or invalid authentication token';
if (!isTokenError) {
throw err;
}
}
}
if (!userData) {
const redirectUrlParams = new URLSearchParams();
redirectUrlParams.append('sso', query.sso.toString());
redirectUrlParams.append('sig', query.sig.toString());
const redirect = `/sso/discourse?${redirectUrlParams}`;
const redirect = `/account/sso/discourse?${redirectUrlParams}`;
const urlParams = new URLSearchParams();
urlParams.append('redirect', redirect);
return sendRedirect(event, `/login?${urlParams}`); // Not logged in, redirect to login
return sendRedirect(event, `/account/login?${urlParams}`); // Not logged in, redirect to login
}
// Build final payload for discourse

View File

@@ -68,11 +68,9 @@ query getProjectsV2($orgName: String!, $cursor: String) {
async function getGitHubProjectsWithItemsV2(octokit: Octokit) {
const projects: Array<{ id: string; title: string; url: string | null; items: Array<{ title: string; column: string }> }> = [];
console.log('Get projects');
const data = await octokit.graphql.paginate(getProjectsWithItemsV2GQL, {
orgName: orgName
});
console.log('Finished get projects');
for (const node of data.organization.projectsV2.nodes) {
projects.push({

View File

@@ -22,7 +22,7 @@ async function loginSubmission() {
});
if (typeof redirect.value === 'string') {
await navigateTo(redirect.value);
await navigateTo(redirect.value, { external: true });
} else {
await navigateTo('/account');
}

View File

@@ -32,7 +32,7 @@ async function registerSubmission() {
});
if (typeof redirect.value === 'string') {
await navigateTo(redirect.value);
await navigateTo(redirect.value, { external: true });
} else {
await navigateTo('/account');
}