Skip to content

Commit 722cbb2

Browse files
committed
Two ways to reach forms-api locally
1 parent e6be0cd commit 722cbb2

File tree

5 files changed

+56
-34
lines changed

5 files changed

+56
-34
lines changed

README.md

+12
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,18 @@ til url til den lokale instansen av innsending-api i miljøvariabelen `SEND_INN_
9898

9999
SEND_INN_HOST=http://127.0.0.1:9064
100100

101+
## Kjøre Bygger lokalt med integrasjon mot forms-api
102+
103+
For kontinuerlig utvikling mot forms-api er det best å hente ned og kjøre https://github.com/navikt/forms-api lokalt.
104+
Sett miljøvariabelen `FORMS_API_URL` i byggeren sin `.env`-fil til riktig port på localhost. F.eks:
105+
106+
FORMS_API_URL=http://localhost:8082
107+
108+
Alternativt kan du bruke [azure-token-generator](https://azure-token-generator.intern.dev.nav.no/api/obo?aud=dev-gcp:fyllut-sendinn:forms-api) (krever trygdeetaten-bruker) til å generere et midlertidig access token for å nå forms-api i preprod. Merk at tokenet kun er gyldig en begrenset periode. Legg til følgende miljøvariabler for å få tilgang.
109+
110+
FORMS_API_URL=https://forms-api.intern.dev.nav.no
111+
FORMS_API_ACCESS_TOKEN=<access-token> // Bruk access_token fra responsen til azure-token-generator
112+
101113
## Teste publisering av skjema på lokal maskin
102114

103115
Byggeren er konfigurert med default-verdier lokalt som sørger for at eventuelle publiseringer blir gjort mot en

packages/bygger-backend/src/config/index.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ const optionalEnv = (name: string): string | undefined => {
3737
};
3838

3939
const naisClusterName = env('NAIS_CLUSTER_NAME') as 'dev-gcp' | 'prod-gcp' | undefined;
40+
const isProduction = nodeEnv === 'production';
41+
const isDevelopment = nodeEnv === 'development';
4042

4143
const config: ConfigType = {
4244
azure: {
@@ -95,6 +97,7 @@ const config: ConfigType = {
9597
user: env('FORMS_API_AD_GROUP_USER', devFormsApi.adGroups.user),
9698
admin: env('FORMS_API_AD_GROUP_ADMIN', devFormsApi.adGroups.admin),
9799
},
100+
devToken: isDevelopment ? optionalEnv('FORMS_API_ACCESS_TOKEN') : undefined,
98101
},
99102
pusher: {
100103
cluster: env('PUSHER_CLUSTER', devPusher.cluster),
@@ -104,8 +107,8 @@ const config: ConfigType = {
104107
},
105108
nodeEnv,
106109
port: parseInt(process.env.PORT || '8080'),
107-
isProduction: nodeEnv === 'production',
108-
isDevelopment: nodeEnv === 'development',
110+
isProduction,
111+
isDevelopment,
109112
featureToggles: featureUtils.toFeatureToggles(env('ENABLED_FEATURES', devEnabledFeatures)),
110113
naisClusterName,
111114
frontendLoggerConfig: configUtils.loadJsonFromEnv('BYGGER_FRONTEND_LOGCONFIG'),

packages/bygger-backend/src/config/types.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export type FormsApiConfig = {
4040
user: string;
4141
admin: string;
4242
};
43+
devToken?: string;
4344
};
4445

4546
export type PusherConfig = {

packages/bygger-backend/src/routers/api/helpers/authHandlers.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import appConfig from '../../../config';
22
import authorizedPublisher from './authorizedPublisher';
33
import azureOnBehalfOfTokenHandler from './azureOnBehalfOfTokenHandler';
44

5-
const { naisClusterName } = appConfig;
5+
const { naisClusterName, formsApi } = appConfig;
66

77
const authHandlers = {
88
authorizedPublisher,
9-
formsApiAuthHandler: azureOnBehalfOfTokenHandler(`${naisClusterName}.fyllut-sendinn.forms-api`),
9+
formsApiAuthHandler: azureOnBehalfOfTokenHandler(`${naisClusterName}.fyllut-sendinn.forms-api`, formsApi.devToken),
1010
};
1111

1212
export default authHandlers;

packages/bygger-backend/src/routers/api/helpers/azureOnBehalfOfTokenHandler.ts

+36-30
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,44 @@ import { UnauthorizedError } from './errors';
77

88
const { azure, isDevelopment } = config;
99

10-
const azureOnBehalfOfTokenHandler = (scope: string) => async (req: Request, res: Response, next: NextFunction) => {
11-
const accessToken = req.get('Authorization')?.replace('Bearer ', '');
10+
const azureOnBehalfOfTokenHandler =
11+
(scope: string, devToken?: string) => async (req: Request, res: Response, next: NextFunction) => {
12+
const accessToken = req.get('Authorization')?.replace('Bearer ', '');
1213

13-
if (isDevelopment) {
14-
logger.info(`Skipping Azure access token fetch (scope='${scope}')`);
15-
return next();
16-
}
17-
18-
try {
19-
const response = await fetchWithErrorHandling(azure.openidTokenEndpoint, {
20-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
21-
method: 'POST',
22-
body: qs.stringify({
23-
assertion: accessToken,
24-
client_id: azure.clientId,
25-
client_secret: azure.clientSecret,
26-
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
27-
requested_token_use: 'on_behalf_of',
28-
scope: `api://${scope}/.default`,
29-
}),
30-
});
31-
req.headers.AzureAccessToken = (response.data as any).access_token;
32-
next();
33-
} catch (error: any) {
34-
if (error.http_response_body) {
35-
next(new UnauthorizedError(`Access token failed with: ${JSON.stringify(error.http_response_body)}`));
36-
} else {
37-
next(new UnauthorizedError(`Access token failed with: ${JSON.stringify(error)}`));
14+
if (isDevelopment) {
15+
if (devToken) {
16+
req.headers.AzureAccessToken = devToken;
17+
logger.info('Using pre-generated access token to fetch');
18+
} else {
19+
logger.info(`Skipping Azure access token fetch (scope='${scope}')`);
20+
}
21+
return next();
3822
}
3923

40-
next(error);
41-
}
42-
};
24+
try {
25+
const response = await fetchWithErrorHandling(azure.openidTokenEndpoint, {
26+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
27+
method: 'POST',
28+
body: qs.stringify({
29+
assertion: accessToken,
30+
client_id: azure.clientId,
31+
client_secret: azure.clientSecret,
32+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
33+
requested_token_use: 'on_behalf_of',
34+
scope: `api://${scope}/.default`,
35+
}),
36+
});
37+
req.headers.AzureAccessToken = (response.data as any).access_token;
38+
next();
39+
} catch (error: any) {
40+
if (error.http_response_body) {
41+
next(new UnauthorizedError(`Access token failed with: ${JSON.stringify(error.http_response_body)}`));
42+
} else {
43+
next(new UnauthorizedError(`Access token failed with: ${JSON.stringify(error)}`));
44+
}
45+
46+
next(error);
47+
}
48+
};
4349

4450
export default azureOnBehalfOfTokenHandler;

0 commit comments

Comments
 (0)