chore: debug
All checks were successful
/ build (map[dockerfile:./services/api/Dockerfile name:api]) (push) Successful in 2m23s
/ build (map[dockerfile:./services/tasks/Dockerfile name:tasks]) (push) Successful in 2m9s
/ build (map[dockerfile:./services/hasura/Dockerfile name:hasura]) (push) Successful in 2m21s
/ build (map[dockerfile:./services/watchers/Dockerfile name:watchers]) (push) Successful in 2m11s
/ build (map[dockerfile:./services/web/Dockerfile name:web]) (push) Successful in 2m8s
/ deploy (push) Successful in 33s
/ build (map[dockerfile:./services/files/Dockerfile name:files]) (push) Successful in 1m18s
/ build (map[dockerfile:./services/app/Dockerfile name:app]) (push) Successful in 1m38s
All checks were successful
/ build (map[dockerfile:./services/api/Dockerfile name:api]) (push) Successful in 2m23s
/ build (map[dockerfile:./services/tasks/Dockerfile name:tasks]) (push) Successful in 2m9s
/ build (map[dockerfile:./services/hasura/Dockerfile name:hasura]) (push) Successful in 2m21s
/ build (map[dockerfile:./services/watchers/Dockerfile name:watchers]) (push) Successful in 2m11s
/ build (map[dockerfile:./services/web/Dockerfile name:web]) (push) Successful in 2m8s
/ deploy (push) Successful in 33s
/ build (map[dockerfile:./services/files/Dockerfile name:files]) (push) Successful in 1m18s
/ build (map[dockerfile:./services/app/Dockerfile name:app]) (push) Successful in 1m38s
This commit is contained in:
parent
e284f59476
commit
6d308bf95d
1 changed files with 90 additions and 0 deletions
|
@ -13,8 +13,15 @@ module.exports = async function ({ services: { signJwt } }) {
|
|||
}
|
||||
|
||||
async function doAuthLoginConfimLoginRequest(req) {
|
||||
const logger = ctx.require("logger")
|
||||
|
||||
const { loginRequestId, deviceUuid } = req.body
|
||||
|
||||
logger.debug(
|
||||
{ loginRequestId, deviceUuid },
|
||||
"Starting login confirmation request"
|
||||
)
|
||||
|
||||
const [userLoginRequest] = await sql`
|
||||
SELECT
|
||||
"user_id" as "userId",
|
||||
|
@ -27,22 +34,46 @@ module.exports = async function ({ services: { signJwt } }) {
|
|||
WHERE
|
||||
"id" = ${loginRequestId}
|
||||
`
|
||||
|
||||
if (!userLoginRequest) {
|
||||
logger.warn({ loginRequestId }, "Login request not found")
|
||||
throw httpError(404)
|
||||
}
|
||||
|
||||
logger.info(
|
||||
{ loginRequestId, type: userLoginRequest.type },
|
||||
"Login request found"
|
||||
)
|
||||
const { type, updatedAt } = userLoginRequest
|
||||
|
||||
const expire = new Date()
|
||||
expire.setTime(expire.getTime() - 2 * 3600000) // 2 hours
|
||||
|
||||
logger.debug(
|
||||
{ loginRequestId, updatedAt, expireThreshold: expire },
|
||||
"Checking login request expiration"
|
||||
)
|
||||
|
||||
if (updatedAt < expire) {
|
||||
logger.warn(
|
||||
{ loginRequestId, updatedAt, expireThreshold: expire },
|
||||
"Login request expired, cleaning up"
|
||||
)
|
||||
deleteLoginRequest(loginRequestId) // cleanup in background
|
||||
throw httpError(498, "login request expired")
|
||||
}
|
||||
|
||||
logger.info({ loginRequestId }, "Login request is valid and not expired")
|
||||
|
||||
let userId
|
||||
logger.info({ loginRequestId, type }, "Resolving user ID by login type")
|
||||
|
||||
switch (type) {
|
||||
case "phone_number": {
|
||||
logger.debug(
|
||||
{ loginRequestId, phoneNumberId: userLoginRequest.phoneNumberId },
|
||||
"Looking up user by phone number"
|
||||
)
|
||||
const [phoneNumber] = await sql`
|
||||
SELECT
|
||||
"user_id" as "userId"
|
||||
|
@ -51,10 +82,29 @@ module.exports = async function ({ services: { signJwt } }) {
|
|||
WHERE
|
||||
"id" = ${userLoginRequest.phoneNumberId}
|
||||
`
|
||||
if (!phoneNumber) {
|
||||
logger.error(
|
||||
{ loginRequestId, phoneNumberId: userLoginRequest.phoneNumberId },
|
||||
"Phone number not found"
|
||||
)
|
||||
throw httpError(404, "Phone number not found")
|
||||
}
|
||||
userId = phoneNumber.userId
|
||||
logger.debug(
|
||||
{
|
||||
loginRequestId,
|
||||
userId,
|
||||
phoneNumberId: userLoginRequest.phoneNumberId,
|
||||
},
|
||||
"User resolved via phone number"
|
||||
)
|
||||
break
|
||||
}
|
||||
case "email": {
|
||||
logger.debug(
|
||||
{ loginRequestId, emailId: userLoginRequest.emailId },
|
||||
"Looking up user by email"
|
||||
)
|
||||
const [email] = await sql`
|
||||
SELECT
|
||||
"user_id" as "userId"
|
||||
|
@ -63,18 +113,35 @@ module.exports = async function ({ services: { signJwt } }) {
|
|||
WHERE
|
||||
"id" = ${userLoginRequest.emailId}
|
||||
`
|
||||
if (!email) {
|
||||
logger.error(
|
||||
{ loginRequestId, emailId: userLoginRequest.emailId },
|
||||
"Email not found"
|
||||
)
|
||||
throw httpError(404, "Email not found")
|
||||
}
|
||||
userId = email.userId
|
||||
logger.debug(
|
||||
{ loginRequestId, userId, emailId: userLoginRequest.emailId },
|
||||
"User resolved via email"
|
||||
)
|
||||
break
|
||||
}
|
||||
default: {
|
||||
logger.error({ loginRequestId, type }, "Invalid login request type")
|
||||
throw httpError(400)
|
||||
}
|
||||
}
|
||||
|
||||
logger.info({ loginRequestId }, "Cleaning up login request")
|
||||
deleteLoginRequest(loginRequestId) // cleanup in background
|
||||
|
||||
let deviceId = null
|
||||
if (deviceUuid) {
|
||||
logger.debug(
|
||||
{ loginRequestId, userId, deviceUuid },
|
||||
"Looking up device for user"
|
||||
)
|
||||
const [matchDevice] = await sql`
|
||||
SELECT
|
||||
"id"
|
||||
|
@ -87,10 +154,23 @@ module.exports = async function ({ services: { signJwt } }) {
|
|||
|
||||
if (matchDevice) {
|
||||
deviceId = matchDevice.id
|
||||
logger.debug(
|
||||
{ loginRequestId, userId, deviceUuid, deviceId },
|
||||
"Device matched for user"
|
||||
)
|
||||
} else {
|
||||
logger.debug(
|
||||
{ loginRequestId, userId, deviceUuid },
|
||||
"No matching device found for user"
|
||||
)
|
||||
}
|
||||
} else {
|
||||
logger.debug({ loginRequestId, userId }, "No device UUID provided")
|
||||
}
|
||||
|
||||
logger.debug({ loginRequestId, userId, deviceId }, "Generating auth token")
|
||||
const plainAuthToken = nanoid()
|
||||
|
||||
await sql`
|
||||
INSERT INTO "auth_token" ("auth_token", "user_id", "device_id")
|
||||
VALUES (${plainAuthToken}, ${userId}, ${deviceId})
|
||||
|
@ -99,8 +179,18 @@ module.exports = async function ({ services: { signJwt } }) {
|
|||
"auth_token" = ${plainAuthToken}, "user_id" = ${userId}
|
||||
`
|
||||
|
||||
logger.debug(
|
||||
{ loginRequestId, userId, deviceId },
|
||||
"Auth token stored in database"
|
||||
)
|
||||
|
||||
const authTokenJwt = await signJwt({ authToken: plainAuthToken })
|
||||
|
||||
logger.debug(
|
||||
{ loginRequestId, userId, deviceId },
|
||||
"Login confirmation completed successfully"
|
||||
)
|
||||
|
||||
return { authTokenJwt }
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue