identity/asset-api/index.js

68 lines
1.8 KiB
JavaScript

import { readFileSync } from "node:fs"
import { createSign } from "node:crypto";
import Fastify from "fastify";
const { private: M2M_PRIVATE_KEY, public: M2M_PUBLIC_KEY } = loadM2MKeys()
const M2M_ALGORITHM = "RSA-SHA512"
const ASSETS_FOLDER = "~/.assets/"
const ASSET_API_LANDING_MESSAGE = "asset-api v1.0.0"
const IDENTITY_API_ENDPOINT = "http://localhost:3000"
const fastify = new Fastify({
logger: true,
})
fastify.get("/", async (request, reply) => {
return signString(ASSET_API_LANDING_MESSAGE)
})
fastify.get("/crypto/cert", async (request, reply) => {
return M2M_PUBLIC_KEY
})
fastify.get("/crypto/algo", (request, reply) => {
return M2M_ALGORITHM
})
fastify.get("/asset", {
async handler(request, reply) {
let url = new URL(IDENTITY_API_ENDPOINT)
url.pathname = "/auth/account/fromkey"
let res = await fetch(url, {
method: "POST",
body: signString(JSON.stringify({
session_key: request.query.session_key,
}))
})
return await res.text()
},
schema: {
query: {
type: "object",
properties: {
id: { type: "string" },
session_key: { type: "string" },
},
required: ["id", "session_key"],
},
},
})
fastify.listen({ port: 3001 })
function loadM2MKeys() {
return {
private: readFileSync("../.keys/m2m-dev.pem").toString("ascii"),
public: readFileSync("../.keys/m2m-dev.pub").toString("ascii"),
}
}
function signString(content) {
let sign = createSign(M2M_ALGORITHM)
sign.update(content)
return `-----BEGIN SIGNED MESSAGE-----\n\n${content}\n\n-----BEGIN SIGNATURE-----\n\n${sign.sign(M2M_PRIVATE_KEY, "base64")}\n-----END SIGNATURE-----`
}