core-app-api: add support for session refresh in GithubAuth

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2021-08-20 16:26:11 +02:00
parent 2fbcaab096
commit f9db16c477
3 changed files with 31 additions and 10 deletions
+1 -1
View File
@@ -394,7 +394,7 @@ export type GithubSession = {
providerInfo: {
accessToken: string;
scopes: Set<string>;
expiresAt: Date;
expiresAt?: Date;
};
profile: ProfileInfo;
backstageIdentity: BackstageIdentity;
@@ -29,15 +29,17 @@ import {
import { SessionManager } from '../../../../lib/AuthSessionManager/types';
import {
AuthSessionStore,
RefreshingAuthSessionManager,
StaticAuthSessionManager,
} from '../../../../lib/AuthSessionManager';
import { OAuthApiCreateOptions } from '../types';
import { OptionalRefreshSessionManagerMux } from '../../../../lib/AuthSessionManager/OptionalRefreshSessionManagerMux';
export type GithubAuthResponse = {
providerInfo: {
accessToken: string;
scope: string;
expiresInSeconds: number;
expiresInSeconds?: number;
};
profile: ProfileInfo;
backstageIdentity: BackstageIdentity;
@@ -68,27 +70,46 @@ class GithubAuth implements OAuthApi, SessionApi {
providerInfo: {
accessToken: res.providerInfo.accessToken,
scopes: GithubAuth.normalizeScope(res.providerInfo.scope),
expiresAt: new Date(
Date.now() + res.providerInfo.expiresInSeconds * 1000,
),
expiresAt: res.providerInfo.expiresInSeconds
? new Date(Date.now() + res.providerInfo.expiresInSeconds * 1000)
: undefined,
},
};
},
});
const sessionManager = new StaticAuthSessionManager({
const refreshingSessionManager = new RefreshingAuthSessionManager({
connector,
defaultScopes: new Set(defaultScopes),
sessionScopes: (session: GithubSession) => session.providerInfo.scopes,
sessionShouldRefresh: (session: GithubSession) => {
const { expiresAt } = session.providerInfo;
if (!expiresAt) {
return false;
}
const expiresInSec = (expiresAt.getTime() - Date.now()) / 1000;
return expiresInSec < 60 * 5;
},
});
const authSessionStore = new AuthSessionStore<GithubSession>({
manager: sessionManager,
const staticSessionManager = new AuthSessionStore<GithubSession>({
manager: new StaticAuthSessionManager({
connector,
defaultScopes: new Set(defaultScopes),
sessionScopes: (session: GithubSession) => session.providerInfo.scopes,
}),
storageKey: `${provider.id}Session`,
sessionScopes: (session: GithubSession) => session.providerInfo.scopes,
});
return new GithubAuth(authSessionStore);
const sessionManagerMux = new OptionalRefreshSessionManagerMux({
refreshingSessionManager,
staticSessionManager,
sessionCanRefresh: session =>
session.providerInfo.expiresAt !== undefined,
});
return new GithubAuth(sessionManagerMux);
}
constructor(private readonly sessionManager: SessionManager<GithubSession>) {}
@@ -20,7 +20,7 @@ export type GithubSession = {
providerInfo: {
accessToken: string;
scopes: Set<string>;
expiresAt: Date;
expiresAt?: Date;
};
profile: ProfileInfo;
backstageIdentity: BackstageIdentity;