-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathusers.js
161 lines (131 loc) · 4.22 KB
/
users.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
const uuid = require('uuid');
const ethSigUtil = require("eth-sig-util");
const jwt = require('jsonwebtoken');
var Tasks = function (config) {
const AWS = config.AWS;
const dynamoDB = config.dynamoDB;
const getAllDataQuery = async (params) => {
const _getAllData = async (params, startKey) => {
if (startKey) {
params.ExclusiveStartKey = startKey
}
return dynamoDB.query(params).promise()
}
let lastEvaluatedKey = null
let rows = []
do {
const result = await _getAllData(params, lastEvaluatedKey)
rows = rows.concat(result.Items)
lastEvaluatedKey = result.LastEvaluatedKey
} while (lastEvaluatedKey)
return rows
}
function generateAuthenticationNonce() {
return uuid.v4().replaceAll('-', '');
}
function generateEncryptionSalt() {
return uuid.v4().replaceAll('-', '');
}
function createUser(data, callback) {
var timestamp = Date.now().toString();
var userId = data.userId;
var authenticationNonce = generateAuthenticationNonce();
var encryptionSalt = generateEncryptionSalt();
var params = {
Item: {
"UserId": {
S: userId
},
"AuthenticationNonce": {
S: authenticationNonce
},
"EncryptionSalt": {
S: encryptionSalt
},
"CreationTime": {
S: timestamp
},
"LastUpdateTime": {
S: timestamp
}
},
ConditionExpression: 'attribute_not_exists(UserId)',
TableName: "TodoTasks-Users"
};
dynamoDB.putItem(params, function (err, data) {
if (err) {
console.log("Error", err);
callback(err, null);
return;
}
callback(null, data);
});
}
async function getUser(data, callback) {
var userId = data.userId;
var params = {
Key: {
"UserId": {
S: userId
}
},
ConsistentRead: true,
TableName: "TodoTasks-Users"
};
dynamoDB.getItem(params, function (err, data) {
if (err) {
callback(err, null);
return;
}
var result = AWS.DynamoDB.Converter.unmarshall(data.Item);
callback(null, result);
});
}
function getUserNonce(data, callback) {
getUser(data, function (err, data) {
if (err) {
callback(err, null);
return;
}
var result = {};
if (data.AuthenticationNonce) {
result.AuthenticationNonce = data.AuthenticationNonce;
}
callback(null, result);
});
}
function authenticateUser(data, callback) {
var userId = data.userId;
var signature = data.signature;
this.getUser({ userId: userId }, function (err, user) {
if (err) {
callback(err, null);
return;
}
var authenticationNonce = user.AuthenticationNonce;
const message = "Verify wallet ownership for TodoTasks.xyz\nNonce: " + authenticationNonce;
const msgParams = {
data: message,
sig: signature
};
var recoveredAddress = ethSigUtil.recoverPersonalSignature(msgParams);
if (recoveredAddress.toLowerCase() != userId.toLowerCase()) {
callback("Invalid signature", null);
return;
}
var sessionToken = jwt.sign({
userId: userId,
}, process.env.SESSION_TOKEN_SECRET_KEY);
callback(null, {
sessionToken: sessionToken
});
});
}
return {
createUser: createUser,
getUser: getUser,
getUserNonce: getUserNonce,
authenticateUser: authenticateUser
}
};
module.exports = Tasks;