Summary
I'll be showing some of the detailed configuration necessary to deploy API Gateway with a Cloud Functions back-end and authentication for a non-human (machine) client. I'll be focusing on the front and back-end authentication configuration. I'll also be showing the client side in Node.js which is very thinly documented by Google.
Architecture
Authentication
Back-end: Cloud Functions
The back-end GCF is deployed requiring authentication. The API Gateway is configured to operate under a Service Account that has the Cloud Function Invoker role.
Front-end: Machine Client
Configuration here is significantly more complicated than the back-end. Configuration areas:
- A Service Account needs to be created and a SA key downloaded. That key is then used to sign a JWT for authentication to the API Gateway.
- Security definitions must be added to OpenAPI spec (Swagger 2.0) that specify that SA as an allowed user.
- The Machine Client itself must generate a JWT to the API Gateway specs and sign that JWT with the SA key.
Code
OpenAPI Security Definition
securityDefinitions: machine-service: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "machine-service@kvpstore.iam.gserviceaccount.com" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/machine-service@kvpstore.iam.gserviceaccount.com" security: - machine-service: []
Machine Client-side
'use strict'; const fetch = require('node-fetch'); const jwt = require('jsonwebtoken'); const sakey = require('./sakey.json'); //json file downloaded from Google IAM const EMAIL = sakey.client_email; const AUDIENCE = 'your audience';// this value corresponds to the "Managed service" name of the API Gateway const ALGORITHM = 'RS256'; const GWY_URL = 'your URL'; const KEY = sakey.private_key function exampleAPICall(email, audience, key, algorithm) { const payload = { iat: Date.now(), exp: Date.now() + 3600, iss: email, aud: audience, sub: email, email: email } const token = jwt.sign(payload, key, {algorithm: algorithm}); const response = await fetch(`${gwyurl}/guid`, { method: 'GET', headers: { 'Authorization': `Bearer ${token}` } }); return await response.json(); }
Copyright ©1993-2024 Joey E Whelan, All rights reserved.