Note: This repository is templated as part of di-ipv-cri-templates, and any substational changes that can be shared should be included back into that repository for re-use elsewhere
Check HMRC Credential Issuer Frontend is a Credential Issuer as part of the GOV.UK One Login programme.
There are two main repositories that comprise this credential issuer:
- This is the website used for displaying the Check Hmrc Credential Issuer.
- There is a related api repository that contains the backend API that provides all the data interaction consumed
For frontend specific work there are the following repositories:
- There is a shared library repository
- This contains Express middleware, shared JavaScript and Sass files, and shared templates
The following quickstart process details how to install and run the CRI frontend webserver with API mocks.
- Node.js (>= 20.11.1)
- NPM (>= 9.6.0)
- pre-commit (>= 2.17.0)
- Clone repository and change directory:
git clone https://github.com/alphagov/di-ipv-cri-check-hmrc-front && cd di-ipv-cri-check-hmrc-front
- Install node dependencies:
npm ci
- Build the assets
npm run build
Create a copy of the example environment variable file and add values for the keys:
cp .env.example .env
Set the environment variables accordingly.
In order to successfully run the application, the following things are required:
- frontend application started and configured to point at an API
- deployed API or mock API needs to be made available and configured
- a correctly formed entry point url using
client_idandrequestOAuth parameters
The app will run on port 5000 by default and be available at http://localhost:5000.
To run the server with continuous build mode:
npm run dev
Note: By default, the server runs with an in-memory Redis instance, so restarting the server will clear the session.
By default, the application will be running at http://localhost:5000.
NODE_ENV=production npm start
An API is required for all oauth requests and all other backend interactions.
This is configured in the frontend application using the API_BASE_URL environment variable, as described in environment variables.
A standalone mock of the api is provided using a combination of the API's OpenAPI config and hand-crafted Imposter scenarios.
More details on how to run this are in the Imposter folder.
When connecting to a mock API both the client_id and request parameters are determined by the data in the Imposter configuration files. The client_id is used for determining what data to return to the frontend, and the request parameter is ignored.
This can also be connected to a deployed API behind an API Gateway, using the same API_BASE_URL variable.
When connecting to a deployed API both the client_id and request parameters are supplied by an upstream service acting as this systems Relying Party. The client_id is configured for use with API and the request payload is signed and encrypted with keys known to the API.
Using the appropriate client_id and request parameters, the website can be accessed using a URL similar to:
http://localhost:5000/oauth2/authorize?request=ignored&client_id=success
Unit tests can be run from the root of the project using:
npm run dev
They use Vitest as the test runner, which is configured using vitest.config.js
Browser tests are run from the test/browser folder, with appropriate quick start documentation located there.subfolder of this project, with more details available there.
Post merge tests can be run locally using the command npm run test:browser -- --tags @post-merge from the test/browser folder.
The following browserType are: firefox, chromium and edge.
You can add the BROWER variable to the .env file with the above browser type and run npm run test:browser.
Docker allows performance testing to be performed locally against the Node system, we can containerise the frontend application and configure it to point to a deployed API or mock API enabling us to test the application locally with similar performance limits to production for memory and CPU.
docker build -t check-front:latest .
Once the image is created, we can use this to spin up a container of the front end using variables to set the amount of memory and CPUs
docker run --memory 1024m --cpus 2 --publish 9050:8080 --env API_BASE_URL=http://localhost:8080 ipv-cri-check-hmrc-front-frontend
For the front end to work correctly, you will need to use a mock API so for this Imposter has been used. Imposter can be ran locally using:
imposter up
You can run the Check HMRC frontend with a deployed Check HMRC CRI stack in AWS. This is useful for backend API testing.
-
The required repositories need to be cloned into the same parent directory, this is a one-time setup:
- This repository (
ipv-cri-check-hmrc-front) - ipv-stubs
- ipv-config
The
npm run ipv-core-stubcommand uses relative paths in the docker-compose file to locate the needed.envandconfigfiles from these repositories. - This repository (
To deploy Check HMRC CRI stack ensure you have the sam-cli installed, create a sso profile for the role AdministratorAccessPermission on the di-ipv-cri-check-hmrc-dev AWS account which can be found by searching the AWS start page .
run:
AWS_PROFILE=profile-name-you-created ./deploy.sh
The Stack Name, CommonStackName and SecretPrefix are optional, but can be overridden by supplying
additional arguments to deploy.sh i.e
AWS_PROFILE=profile-name-you-created ./deploy.sh STACKNAME YOUR-COMMON-STACKNAME YOUR-SECRET-PREFIX
- Once deployed, note the stack outputs containing the
public-apiandprivate-apiIDs
- Create a
.envfile if you don't already have in the project root and add theprivate-apiID as theAPI_BASE_URL:
API_BASE_URL=https://xxxxx.execute-api.eu-west-2.amazonaws.com/localdevReplace xxxxx with your actual private API ID.
Example: If your private API ID is 75dre0xy11, the URL would be:
API_BASE_URL=https://75dre0xy11.execute-api.eu-west-2.amazonaws.com/localdev- Update the config file with your deployed stack's public API ID:
credentialIssuerConfigs:
- id: check-hmrc-dev
name: HMRC Check CRI local
jwksEndpoint: https://api.review-hc.dev.account.gov.uk/.well-known/jwks.json
useKeyRotation: true
authorizeUrl: http://localhost:5000/oauth2/authorize
tokenUrl: https://xxxxx.execute-api.eu-west-2.amazonaws.com/localdev/token
credentialUrl: https://xxxxx.execute-api.eu-west-2.amazonaws.com/localdev/credential/issue
audience: https://review-hc.dev.account.gov.uk
sendIdentityClaims: true
publicEncryptionJwkBase64: "..."
publicVCSigningVerificationJwkBase64: ".."
apiKeyEnvVar: API_KEY_CRI_DEV-
Replace
xxxxxwith your actual public API ID in bothtokenUrlandcredentialUrlExample: If your public API ID is
v3qbtrl07c, update the URLs to:tokenUrl: https://v3qbtrl07c.execute-api.eu-west-2.amazonaws.com/localdev/token credentialUrl: https://v3qbtrl07c.execute-api.eu-west-2.amazonaws.com/localdev/credential/issue
-
Start the IPV core stub:
npm run ipv-core-stub
-
In a new terminal, build and start the Check HMRC frontend:
npm run build && npm run dev -
Access the core stub at: http://localhost:8085
With the inclusion of dynatrace in the repository, local testing errors due to authentication. A possible solution to this is to use a local.Dockerfile without the dynatrace layer.
The codebase is released under the MIT License.