Skip to content

Commit 041e400

Browse files
committed
Split token sources in separate files
This improves the readability
1 parent 374194a commit 041e400

File tree

13 files changed

+441
-428
lines changed

13 files changed

+441
-428
lines changed

src/gateway.test.ts

Lines changed: 130 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -1,151 +1,151 @@
11
import { ApolloServer, HeaderMap } from "@apollo/server";
22
import { GatewayAuthPlugin } from "./gateway";
33
import {
4-
PublicFederatedToken,
5-
PublicFederatedTokenContext,
6-
TokenSigner,
4+
PublicFederatedToken,
5+
PublicFederatedTokenContext,
6+
TokenSigner,
77
} from "./jwt";
88
import { assert, describe, expect, it } from "vitest";
99
import httpMocks from "node-mocks-http";
10-
import { HeaderTokenSource } from "./tokensource";
10+
import { HeaderTokenSource } from "./tokensource/headers";
1111

1212
describe("GatewayAuthPlugin", () => {
13-
const signer = new TokenSigner({
14-
audience: "exampleAudience",
15-
issuer: "exampleIssuer",
16-
encryptKey: "foo",
17-
signKey: "bar",
18-
});
13+
const signer = new TokenSigner({
14+
audience: "exampleAudience",
15+
issuer: "exampleIssuer",
16+
encryptKey: "foo",
17+
signKey: "bar",
18+
});
1919

20-
const plugin = new GatewayAuthPlugin({
21-
signer: signer,
22-
source: new HeaderTokenSource(),
23-
});
20+
const plugin = new GatewayAuthPlugin({
21+
signer: signer,
22+
source: new HeaderTokenSource(),
23+
});
2424

25-
const typeDefs = `#graphql
25+
const typeDefs = `#graphql
2626
type Query {
2727
testToken(create: Boolean): String!
2828
refreshToken: String!
2929
}
3030
`;
31-
const resolvers = {
32-
Query: {
33-
testToken: (
34-
_: any,
35-
{ create }: { create: boolean },
36-
context: PublicFederatedTokenContext
37-
) => {
38-
if (!context.federatedToken) {
39-
throw new Error("No federated token");
40-
}
41-
if (create) {
42-
context.federatedToken.setAccessToken("foo", {
43-
token: "bar",
44-
exp: Date.now() + 1000,
45-
});
46-
context.federatedToken.setRefreshToken("foo", "bar");
47-
}
48-
return JSON.stringify(context.federatedToken);
49-
},
50-
refreshToken: (_: any, context: PublicFederatedTokenContext) => {
51-
context.federatedToken?.setAccessToken("foo", {
52-
token: "bar",
53-
exp: Date.now() + 1000,
54-
});
55-
return JSON.stringify(context.federatedToken);
56-
},
57-
},
58-
};
31+
const resolvers = {
32+
Query: {
33+
testToken: (
34+
_: any,
35+
{ create }: { create: boolean },
36+
context: PublicFederatedTokenContext
37+
) => {
38+
if (!context.federatedToken) {
39+
throw new Error("No federated token");
40+
}
41+
if (create) {
42+
context.federatedToken.setAccessToken("foo", {
43+
token: "bar",
44+
exp: Date.now() + 1000,
45+
});
46+
context.federatedToken.setRefreshToken("foo", "bar");
47+
}
48+
return JSON.stringify(context.federatedToken);
49+
},
50+
refreshToken: (_: any, context: PublicFederatedTokenContext) => {
51+
context.federatedToken?.setAccessToken("foo", {
52+
token: "bar",
53+
exp: Date.now() + 1000,
54+
});
55+
return JSON.stringify(context.federatedToken);
56+
},
57+
},
58+
};
5959

60-
const testServer = new ApolloServer({
61-
typeDefs,
62-
resolvers,
63-
plugins: [plugin],
64-
});
60+
const testServer = new ApolloServer({
61+
typeDefs,
62+
resolvers,
63+
plugins: [plugin],
64+
});
6565

66-
it("should return the plugin instance", async () => {
67-
const context = {
68-
federatedToken: new PublicFederatedToken(),
69-
res: httpMocks.createResponse(),
70-
req: httpMocks.createRequest(),
71-
};
72-
await testServer.executeOperation(
73-
{
74-
query: "query testToken { testToken(create: true) }",
75-
http: {
76-
headers: new HeaderMap(),
77-
method: "POST",
78-
search: "",
79-
body: "",
80-
},
81-
},
82-
{
83-
contextValue: context,
84-
}
85-
);
86-
expect(context.res.statusCode).toBe(200);
87-
expect(context.res.get("x-access-token")).toBeDefined();
88-
expect(context.res.get("x-refresh-token")).toBeDefined();
89-
});
66+
it("should return the plugin instance", async () => {
67+
const context = {
68+
federatedToken: new PublicFederatedToken(),
69+
res: httpMocks.createResponse(),
70+
req: httpMocks.createRequest(),
71+
};
72+
await testServer.executeOperation(
73+
{
74+
query: "query testToken { testToken(create: true) }",
75+
http: {
76+
headers: new HeaderMap(),
77+
method: "POST",
78+
search: "",
79+
body: "",
80+
},
81+
},
82+
{
83+
contextValue: context,
84+
}
85+
);
86+
expect(context.res.statusCode).toBe(200);
87+
expect(context.res.get("x-access-token")).toBeDefined();
88+
expect(context.res.get("x-refresh-token")).toBeDefined();
89+
});
9090

91-
it("Use generated token", async () => {
92-
let context = {
93-
federatedToken: new PublicFederatedToken(),
94-
res: httpMocks.createResponse(),
95-
req: httpMocks.createRequest(),
96-
};
97-
await testServer.executeOperation(
98-
{
99-
query: "query testToken { testToken(create: true) }",
100-
http: {
101-
headers: new HeaderMap(),
102-
method: "POST",
103-
search: "",
104-
body: "",
105-
},
106-
},
107-
{
108-
contextValue: context,
109-
}
110-
);
111-
expect(context.res.statusCode).toBe(200);
112-
expect(context.res.get("x-access-token")).toBeDefined();
113-
expect(context.res.get("x-refresh-token")).toBeDefined();
114-
const accessToken = context.res.get("x-access-token");
91+
it("Use generated token", async () => {
92+
let context = {
93+
federatedToken: new PublicFederatedToken(),
94+
res: httpMocks.createResponse(),
95+
req: httpMocks.createRequest(),
96+
};
97+
await testServer.executeOperation(
98+
{
99+
query: "query testToken { testToken(create: true) }",
100+
http: {
101+
headers: new HeaderMap(),
102+
method: "POST",
103+
search: "",
104+
body: "",
105+
},
106+
},
107+
{
108+
contextValue: context,
109+
}
110+
);
111+
expect(context.res.statusCode).toBe(200);
112+
expect(context.res.get("x-access-token")).toBeDefined();
113+
expect(context.res.get("x-refresh-token")).toBeDefined();
114+
const accessToken = context.res.get("x-access-token");
115115

116-
// Set received token
117-
const newContext = {
118-
federatedToken: new PublicFederatedToken(),
119-
res: httpMocks.createResponse(),
120-
req: httpMocks.createRequest({
121-
headers: {
122-
"x-access-token": `Bearer ${accessToken}`,
123-
},
124-
}),
125-
};
126-
const response = await testServer.executeOperation(
127-
{
128-
query: "query testToken { testToken(create: false) }",
129-
http: {
130-
headers: new HeaderMap(),
131-
method: "POST",
132-
search: "",
133-
body: "",
134-
},
135-
},
136-
{
137-
contextValue: newContext,
138-
}
139-
);
140-
expect(response.body.kind).toBe("single");
141-
assert(response.body.kind === "single"); // Make typescript happy
142-
expect(response.body.singleResult).toBeDefined();
116+
// Set received token
117+
const newContext = {
118+
federatedToken: new PublicFederatedToken(),
119+
res: httpMocks.createResponse(),
120+
req: httpMocks.createRequest({
121+
headers: {
122+
"x-access-token": `Bearer ${accessToken}`,
123+
},
124+
}),
125+
};
126+
const response = await testServer.executeOperation(
127+
{
128+
query: "query testToken { testToken(create: false) }",
129+
http: {
130+
headers: new HeaderMap(),
131+
method: "POST",
132+
search: "",
133+
body: "",
134+
},
135+
},
136+
{
137+
contextValue: newContext,
138+
}
139+
);
140+
expect(response.body.kind).toBe("single");
141+
assert(response.body.kind === "single"); // Make typescript happy
142+
expect(response.body.singleResult).toBeDefined();
143143

144-
const token = JSON.parse(
145-
response.body.singleResult.data?.testToken as string
146-
) as PublicFederatedToken;
147-
expect(token.tokens.foo.token).toBe("bar");
148-
expect(newContext.res.get("x-access-token")).toBeUndefined();
149-
expect(newContext.res.get("x-refresh-token")).toBeUndefined();
150-
});
144+
const token = JSON.parse(
145+
response.body.singleResult.data?.testToken as string
146+
) as PublicFederatedToken;
147+
expect(token.tokens.foo.token).toBe("bar");
148+
expect(newContext.res.get("x-access-token")).toBeUndefined();
149+
expect(newContext.res.get("x-refresh-token")).toBeUndefined();
150+
});
151151
});

src/gateway.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
TokenSigner,
1111
} from "./jwt";
1212
import { GraphQLError } from "graphql";
13-
import { TokenSource } from "./tokensource";
13+
import { TokenSource } from "./tokensource/base";
1414

1515
type GatewayOptions = {
1616
signer: TokenSigner;
@@ -54,8 +54,8 @@ export class GatewayAuthPlugin<TContext extends PublicFederatedTokenContext>
5454

5555
const token = contextValue.federatedToken;
5656

57-
// Only load the access token if there is no refresh token. If a refresh
58-
// token is present then we assume a refresh is happening
57+
// Only load the access token if there is no refresh token. If a refresh
58+
// token is present then we assume a refresh is happening
5959
if (accessToken && !refreshToken) {
6060
try {
6161
await token.loadAccessJWT(this.signer, accessToken, fingerprint);

src/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,4 @@ export { FederatedAuthPlugin } from "./plugin";
55
export { FederatedToken } from "./token";
66

77
export { type TokenSource } from "./tokensource";
8-
export {
9-
CompositeTokenSource,
10-
CookieTokenSource,
11-
HeaderTokenSource,
12-
} from "./tokensource";
8+
export { CompositeTokenSource, CookieTokenSource, HeaderTokenSource, } from "./tokensource";

0 commit comments

Comments
 (0)