68 lines
1.8 KiB
JavaScript
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-----`
|
|
} |