From 1b2a4e9ce4fbe6dc8f150fa992878e0960a3518a Mon Sep 17 00:00:00 2001 From: "Sewmina (server)" Date: Mon, 23 Dec 2024 18:00:19 +0800 Subject: [PATCH] stable --- database.js | 24 ++++++++ firebase.js | 16 ++++++ index.js | 115 ++++++++++++++++++++++++++++++--------- keys/serviceAccount.json | 14 +++++ package-lock.json | 21 +++++++ package.json | 1 + 6 files changed, 165 insertions(+), 26 deletions(-) create mode 100644 firebase.js create mode 100644 keys/serviceAccount.json diff --git a/database.js b/database.js index d0f600a..d43bee2 100644 --- a/database.js +++ b/database.js @@ -59,4 +59,28 @@ export async function GetPrivateKey(pubkey){ export async function GetKeypairFromEmail(email){ const [rows] = await pool.query("SELECT Users.pub_key,Users.email, PrivateKeys.private_key FROM Users JOIN PrivateKeys ON Users.pub_key = PrivateKeys.pub_key WHERE email=?", [email]); return rows[0]; +} + +export async function CreateNewRequest(){ + const id = uuidv4(); + + await pool.query(`INSERT INTO Requests (id) VALUES(?)`, [id]); + + return id; +} + +export async function SetRequestResult(id,result){ + const [rows] = await pool.query("UPDATE Requests SET result=?, status=1 WHERE id=?", [result,id]); + + return rows.length; +} + + +function uuidv4() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' + .replace(/[xy]/g, function (c) { + const r = Math.random() * 16 | 0, + v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); } \ No newline at end of file diff --git a/firebase.js b/firebase.js new file mode 100644 index 0000000..46e6bbc --- /dev/null +++ b/firebase.js @@ -0,0 +1,16 @@ +import admin from "firebase-admin"; +import { applicationDefault } from 'firebase-admin/app'; +import serviceAccountKey from './keys/serviceAccount.json' assert { type: "json" }; + +export const app = admin.initializeApp({ + credential: admin.credential.cert(serviceAccountKey) +}); + +export const verifyFirebaseToken = async (token) => { + try { + const decodedToken = await app.auth().verifyIdToken(token); + return decodedToken; // Includes uid, email, etc. + } catch (error) { + return null; + } + }; \ No newline at end of file diff --git a/index.js b/index.js index d5f8809..86ed32f 100644 --- a/index.js +++ b/index.js @@ -1,21 +1,21 @@ import express from 'express'; import dotenv from 'dotenv'; -import {RegisterNewUser, GetUserFromEmail, GetUserFromPubkey, GetKeypairFromEmail, Authneticate} from './database.js'; +import { RegisterNewUser, GetUserFromEmail, GetUserFromPubkey, GetKeypairFromEmail, Authneticate, CreateNewRequest, SetRequestResult } from './database.js'; +import { verifyFirebaseToken } from './firebase.js'; dotenv.config(); const app = express(); - +import cors from 'cors'; +app.use(cors()); app.use((err,req,res,next)=>{ console.error(err.stack); res.status(500).send("Something went wrong!"); }) //---------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -app.get("/register", async (req,res)=>{ +app.get("/registerv1", async (req,res)=>{ const {email, password} = req.query; if(!email || !password){ @@ -31,13 +31,43 @@ app.get("/register", async (req,res)=>{ res.status(201).json(newUser); }) -app.get("/login", async(req,res)=>{ - const {email, pubkey} = req.query; - if(!email && !pubkey){ - res.status(403).json({error:"Neither email nor pubkey was sent"}) +app.get("/register", async (req,res)=>{ + const {tokenId} = req.query; + + if(!tokenId){ + res.status(403).json({error: "Missing tokenId"}); + return; + } + const user = await verifyFirebaseToken(tokenId); + if(!user){ + res.status(403).json({error:"Invalid tokenId. Auth failed"}); return; } + + const newUser = await RegisterNewUser(user.uid,user.uid); + + if(!newUser){ + res.status(403).json({error: "User exists"}); + } + + res.status(201).json(newUser); +}) + +app.get("/login", async(req,res)=>{ + const {tokenId} = req.query; + if(!tokenId){ + res.status(403).json({error:"Missing tokenId"}) + return; + } + + const fuser = await verifyFirebaseToken(tokenId); + if(!fuser){ + res.status(403).json({error:"Invalid tokenId. Auth failed"}); + return; + } + const email = fuser.uid; + if(email){ const user = await GetUserFromEmail(email); if(user){ @@ -45,13 +75,6 @@ app.get("/login", async(req,res)=>{ }else{ res.status(404).json({error:"User couldnt be found"}) } - }else if(pubkey){ - const user = await GetUserFromPubkey(pubkey); - if(user){ - res.status(200).json(user); - }else{ - res.status(404).json({error:"User couldnt be found"}) - } } }) @@ -70,20 +93,21 @@ app.get("/authenticate", async(req,res)=>{ } }) -app.get("/getKeypairWithPassword", async(req,res)=>{ - const {email, password} = req.query; - if(!email || !password){ - res.status(403).json({error:"Credentials missing"}) +app.get("/getKeypairWithToken", async(req,res)=>{ + const {tokenId} = req.query; + if(!tokenId){ + res.status(403).json({error:"tokenId missing"}) return; } - const authResult = await Authneticate(email,password); - if(authResult){ - const user = await GetKeypairFromEmail(email); - res.status(200).json(user) - }else{ - res.status(403).json({authenticated: false}) + const fuser = await verifyFirebaseToken(tokenId); + if(!fuser){ + res.status(403).json({error:"Invalid tokenId. Auth failed"}); + return; } + + const user = await GetKeypairFromEmail(fuser.uid); + res.status(200).json(user); }) app.get("/getPubkey", async(req,res)=>{ @@ -116,6 +140,45 @@ app.get("/getKeypair", async(req,res)=>{ res.status(200).json(user); }) +app.get("/firebaseAuth", async (req,res)=>{ + const {tokenId} = req.query; + + if(!tokenId){ + res.status(403).json({error: "Invalid tokenID"}); + return; + } + + const user = await verifyFirebaseToken(tokenId); + if(user){ + res.status(200).json({status:"Success", user: user}); + }else{ + res.status(403).json({status:"Failed", user:null}); + } +}) + +app.get("/createNewRequest", async(req,res)=>{ + const id = await CreateNewRequest(); + + res.status(200).json({id:id}); +}) + +app.get("/completeRequest", async(req,res)=>{ + const {id,result}=req.query; + + if(!id || !result){ + res.status(403).json({error:"Missing parameters, need id and result"}); + return; + } + + await SetRequestResult(id,result); + + res.status(200).json({status:"Success"}); +}) + +app.get("/status", async(req,res)=>{ + res.status(200).json({status:"Running"}); +}) + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/keys/serviceAccount.json b/keys/serviceAccount.json new file mode 100644 index 0000000..d603d80 --- /dev/null +++ b/keys/serviceAccount.json @@ -0,0 +1,14 @@ +{ + "type": "service_account", + "project_id": "sologin-55bbd", + "private_key_id": "d8003aa087c48e44a963fa0d80813e2ca4625506", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDrWwRaTiuwoN8v\nOkkOTlhgwpSYcZK1Ys0rI22MprfuFiyGiygQGYGDzP89aq6Y7Qxe/E7ZU6jEIB0t\nNc2gBTPepFh9bBZ8Cdn3vhqxGwLwZA+K3Q+JBPgeF/rQyPJvH1gsZvSHnDy6MqOL\nA3iTyOowpZARTlxCeNZKuG6jr06RMZhPScrAOlJH8Uw2XFhpD+pzxKErmFszulCh\n1HQbZYXAm6yiqKApLdm8QfPUbdevrhAEKDNLpcgtml4xDCXYLd6/XMat/aAvgUCT\n63+eR1VjSIJfIOMAQXI8+NkRMxUqvptfYU42uvgH5BQoD8VPOfLk1umEnTgJ1OYY\nWhPoEKb1AgMBAAECggEAbTCj21Wq9V4dTWboH+f/Hp0HnZYLb3WwJBRirb9nU+Eb\ntSv4YUfEC6bev9qvuCk59RNvbWpfwOX5Q1FT3aqsPt3WZBHyeIeFhWfAMGyMt4Rk\npZMbswEIL8YGSjkAKMfM+4SkbAnzLptxvnvUxBORexJEvZKyQPCY0r+wLOaXN8p7\nzZHapiDp3CcpgDtduGnGFgBlg1uyB0/N75aviCtBtT1JHuZkPo4VGJ+2WwP2KM6l\nvLhb5HDGIxQHEJDb0ejzmb1UAXvIIiWscLzXAX32OdHjGIOb7h7GRlQGd/HJgUCZ\nhDrhsTR2hZTf9ibYNzWsll+uYx6Y98nqdslxT3BN3QKBgQD4aapMusgGPJzuoRi2\neu+yZ37dLRkjFN82gIyOhp6eSdm6KDTjPjC4+KfyiA40HsptEONuI+j9OtTLse/n\nrNHEyEF9mgowtON9eTCUS40VVvWEuNECWl8doJiHtUBeKRiQik9ULWfpABxDkSw6\nzgNJlbj84fYsOnJYWWGnJMf4OwKBgQDyi0HyquE57LCwrGcN8q0+gfm01z4hxlDo\ncTZBr2SwlJAzZHSjPQb7X/Kwigc0p9fExNvOLsvEOOXV0LBq1nDgenZhRxOxxqoR\nFXt6rHKihsMVIxxe5Q8yEo+DApz/tb6SHM+Ucajf0AFb0Rqi4RSuaTUJ0dHTYvuU\nO0vHXAUajwKBgDf6F5YSwOAm6HYddyQnr7vT9pKAhxmQqnvtm77CNxwUKCv6w3Ax\no2kLH01Xu1ujVJofJCC9ltL5XtpHzne2Sc6+EYPsIj+3g0vS8093duNIJSszOmX9\nV1GlzrlF7qtJN2/auuWNFc07aSMQo5bctYDvbDAP+xkcUof2HDs93pHhAoGBAOq8\nMfgsv0uzMhHa2OYb3uVnH4eQ5VYEvBsqLmuF1zo6nhDPAT9W+eHhK10GSREB/AY4\ny86RZa4jrvSvQ34yyg3HF7jv9DSS49ci5l2EdnGrYTScxYFlyL4aToBp0A5/E9AP\nSCsPkXQCuL3m8xN+KOjfc3Bse9lMq9T7SkzIVzwrAoGAKpPRi+pwZir/3Uz6UVPE\np+7PV34vjdlc2pNbDd5PY765wHgZ2L7RLY4b3qROTgbTsxUXNRRBaPNNoeT9HUsk\nsMo5YEdxR8Najbw17TkILIJudPL8643yOhDFox8ap0ddDtx8VaIkzMdAiT7D1i+N\nM4m3NFgEXdnlc2YIQ4P9jhA=\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-zxug8@sologin-55bbd.iam.gserviceaccount.com", + "client_id": "115460243259470432140", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-zxug8%40sologin-55bbd.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" + } + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 77d04e9..fd00805 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@solana/spl-token": "^0.4.9", "@solana/web3.js": "^1.95.4", "bs58": "^6.0.0", + "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.1", "firebase-admin": "^13.0.0", @@ -1231,6 +1232,18 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-fetch": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", @@ -2508,6 +2521,14 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", diff --git a/package.json b/package.json index 3e471be..204d51f 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@solana/spl-token": "^0.4.9", "@solana/web3.js": "^1.95.4", "bs58": "^6.0.0", + "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.1", "firebase-admin": "^13.0.0",