Fix getting auth data from API proxy returns stale data

This commit is contained in:
Samuel Elliott 2024-02-11 21:51:34 +00:00
parent 3e0ba063f8
commit 6be0ca949a
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
3 changed files with 20 additions and 3 deletions

View File

@ -7,7 +7,7 @@ import bodyParser from 'body-parser';
import type { Arguments as ParentArguments } from './index.js';
import CoralApi, { CoralApiInterface, CoralErrorResponse } from '../../api/coral.js';
import { Announcement, CoralStatus, CurrentUser, Friend, FriendCodeUrl, FriendCodeUser, Presence } from '../../api/coral-types.js';
import { AuthPolicy, AuthToken, ZncPresenceEventStreamEvent } from '../../api/znc-proxy.js';
import ZncProxyApi, { AuthPolicy, AuthToken, ZncPresenceEventStreamEvent } from '../../api/znc-proxy.js';
import createDebug from '../../util/debug.js';
import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js';
import { initStorage } from '../../util/storage.js';
@ -319,7 +319,11 @@ class Server extends HttpServer {
}
async handleAuthRequest({user}: RequestDataWithUser) {
return user.data;
if (user.nso instanceof ZncProxyApi) {
return user.nso.fetch('/auth');
} else {
return user.data;
}
}
async handleTokenRequest({policy, token}: RequestData) {

View File

@ -157,6 +157,8 @@ async function renewToken(
await storage.setItem('NsoToken.' + na_session_token, existingToken);
renew_token_data.existingToken = existingToken;
return existingToken;
} catch (err) {
await attempt?.recordError(err);

View File

@ -1,9 +1,10 @@
import * as crypto from 'node:crypto';
import * as persist from 'node-persist';
import { Response } from 'undici';
import createDebug from '../util/debug.js';
import CoralApi, { CoralApiInterface, Result } from '../api/coral.js';
import ZncProxyApi from '../api/znc-proxy.js';
import { Announcements, Friends, Friend, GetActiveEventResult, CoralSuccessResponse, WebService, WebServices } from '../api/coral-types.js';
import { Announcements, Friends, Friend, GetActiveEventResult, CoralSuccessResponse, WebService, WebServices, CoralError } from '../api/coral-types.js';
import { getToken, SavedToken } from './auth/coral.js';
import type { Store } from '../app/main/index.js';
import { NintendoAccountUser } from '../api/na.js';
@ -72,6 +73,16 @@ export default class Users<T extends UserData> {
const user = new CoralUser(nso, data, announcements, friends, webservices, active_event);
if (nso instanceof CoralApi && nso.onTokenExpired) {
const renewToken = nso.onTokenExpired;
nso.onTokenExpired = async (error?: CoralError, response?: Response) => {
const auth_data = await renewToken(error, response) as SavedToken;
user.data = auth_data;
return auth_data;
};
}
if (store) {
await maybeUpdateWebServicesListCache(cached_webservices, store, data.user, webservices);
user.onUpdatedWebServices = webservices => {