Sign in with google

This commit is contained in:
Gilbert
2024-04-23 21:22:11 -05:00
parent c395be82b5
commit d2daed4cac
10 changed files with 222 additions and 70 deletions
+30 -12
View File
@@ -1,37 +1,55 @@
import { Router } from 'express';
import { SiweMessage } from 'siwe';
import { Service } from '../service';
const router = Router();
router.post('/validate', async (req, res) => {
const { message, signature } = req.body;
const { message, signature, action } = req.body;
const { success, data } = await new SiweMessage(message).verify({
signature,
});
if (success) {
req.session.address = data.address;
req.session.chainId = data.chainId;
if (!success) {
return res.send({ success });
}
const service: Service = req.app.get('service');
const user = await service.getUserByEthAddress(data.address);
if (action === 'signup') {
if (user) {
return res.send({ success: false, error: 'user_already_exists' });
}
const newUser = await service.loadOrCreateUser(data.address);
req.session.userId = newUser.id;
} else if (action === 'login') {
if (!user) {
return res.send({ success: false, error: 'user_not_found' });
}
req.session.userId = user.id;
}
req.session.address = data.address;
res.send({ success });
});
router.get('/session', (req, res) => {
if (req.session.address && req.session.chainId) {
res.send({ address: req.session.address, chainId: req.session.chainId });
if (req.session.address) {
res.send({
userId: req.session.userId,
address: req.session.address,
});
} else {
res.status(401).send({ error: 'Unauthorized: No active session' });
}
});
router.post('/logout', (req, res) => {
req.session.destroy((err) => {
if (err) {
return res.send({ success: false });
}
res.send({ success: true });
});
// This is how you clear cookie-session
(req as any).session = null;
res.send({ success: true });
});
export default router;
+1 -1
View File
@@ -23,8 +23,8 @@ const log = debug('snowball:server');
declare module 'express-session' {
interface SessionData {
userId: string;
address: string;
chainId: number;
}
}
+7 -3
View File
@@ -161,13 +161,17 @@ export class Service {
});
}
async loadOrCreateUser (ethAddress: string): Promise<User> {
// Get user by ETH address
let user = await this.db.getUser({
async getUserByEthAddress (ethAddress: string): Promise<User | null> {
return await this.db.getUser({
where: {
ethAddress
}
});
}
async loadOrCreateUser (ethAddress: string): Promise<User> {
// Get user by ETH address
let user = await this.getUserByEthAddress(ethAddress);
if (!user) {
const [org] = await this.db.getOrganizations({});