Non expiring access token per auth token

This commit is contained in:
simojenki
2021-03-17 08:39:19 +11:00
parent 7637cf95f6
commit 5ee9dd5d5b
3 changed files with 51 additions and 6 deletions

View File

@@ -76,3 +76,21 @@ export class EncryptedAccessTokens implements AccessTokens {
} }
} }
} }
export class AccessTokenPerAuthToken implements AccessTokens {
authTokenToAccessToken = new Map<string, string>();
accessTokenToAuthToken = new Map<string, string>();
mint = (authToken: string): string => {
if (this.authTokenToAccessToken.has(authToken)) {
return this.authTokenToAccessToken.get(authToken)!;
} else {
const accessToken = uuid();
this.authTokenToAccessToken.set(authToken, accessToken);
this.accessTokenToAuthToken.set(accessToken, authToken);
return accessToken;
}
};
authTokenFor = (value: string): string | undefined => this.accessTokenToAuthToken.get(value);
}

View File

@@ -13,9 +13,7 @@ import {
import { LinkCodes, InMemoryLinkCodes } from "./link_codes"; import { LinkCodes, InMemoryLinkCodes } from "./link_codes";
import { MusicService, isSuccess } from "./music_service"; import { MusicService, isSuccess } from "./music_service";
import bindSmapiSoapServiceToExpress from "./smapi"; import bindSmapiSoapServiceToExpress from "./smapi";
import { AccessTokens, EncryptedAccessTokens } from "./access_tokens"; import { AccessTokens, AccessTokenPerAuthToken } from "./access_tokens";
import encryption from "./encryption";
import randomString from "./random_string";
export const BONOB_ACCESS_TOKEN_HEADER = "bonob-access-token"; export const BONOB_ACCESS_TOKEN_HEADER = "bonob-access-token";
@@ -25,9 +23,7 @@ function server(
webAddress: string | "http://localhost:4534", webAddress: string | "http://localhost:4534",
musicService: MusicService, musicService: MusicService,
linkCodes: LinkCodes = new InMemoryLinkCodes(), linkCodes: LinkCodes = new InMemoryLinkCodes(),
accessTokens: AccessTokens = new EncryptedAccessTokens( accessTokens: AccessTokens = new AccessTokenPerAuthToken()
encryption(randomString())
)
): Express { ): Express {
const app = express(); const app = express();

View File

@@ -2,6 +2,7 @@ import { v4 as uuid } from "uuid";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { import {
AccessTokenPerAuthToken,
EncryptedAccessTokens, EncryptedAccessTokens,
ExpiringAccessTokens, ExpiringAccessTokens,
} from "../src/access_tokens"; } from "../src/access_tokens";
@@ -178,3 +179,33 @@ describe("EncryptedAccessTokens", () => {
}); });
}); });
}); });
describe("AccessTokenPerAuthToken", () => {
const accessTokens = new AccessTokenPerAuthToken();
it("should return the same access token for the same auth token", () => {
const authToken = "token1";
const accessToken1 = accessTokens.mint(authToken);
const accessToken2 = accessTokens.mint(authToken);
expect(accessToken1).not.toEqual(authToken);
expect(accessToken1).toEqual(accessToken2);
});
describe("when there is an auth token for the access token", () => {
it("should be able to retrieve it", () => {
const authToken = uuid();
const accessToken = accessTokens.mint(authToken);
expect(accessTokens.authTokenFor(accessToken)).toEqual(authToken);
});
});
describe("when there is no auth token for the access token", () => {
it("should return undefined", () => {
expect(accessTokens.authTokenFor(uuid())).toBeUndefined();
});
});
});