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) {
|
async function doAuthLoginConfimLoginRequest(req) {
|
||||||
|
const logger = ctx.require("logger")
|
||||||
|
|
||||||
const { loginRequestId, deviceUuid } = req.body
|
const { loginRequestId, deviceUuid } = req.body
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
{ loginRequestId, deviceUuid },
|
||||||
|
"Starting login confirmation request"
|
||||||
|
)
|
||||||
|
|
||||||
const [userLoginRequest] = await sql`
|
const [userLoginRequest] = await sql`
|
||||||
SELECT
|
SELECT
|
||||||
"user_id" as "userId",
|
"user_id" as "userId",
|
||||||
|
@ -27,22 +34,46 @@ module.exports = async function ({ services: { signJwt } }) {
|
||||||
WHERE
|
WHERE
|
||||||
"id" = ${loginRequestId}
|
"id" = ${loginRequestId}
|
||||||
`
|
`
|
||||||
|
|
||||||
if (!userLoginRequest) {
|
if (!userLoginRequest) {
|
||||||
|
logger.warn({ loginRequestId }, "Login request not found")
|
||||||
throw httpError(404)
|
throw httpError(404)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
{ loginRequestId, type: userLoginRequest.type },
|
||||||
|
"Login request found"
|
||||||
|
)
|
||||||
const { type, updatedAt } = userLoginRequest
|
const { type, updatedAt } = userLoginRequest
|
||||||
|
|
||||||
const expire = new Date()
|
const expire = new Date()
|
||||||
expire.setTime(expire.getTime() - 2 * 3600000) // 2 hours
|
expire.setTime(expire.getTime() - 2 * 3600000) // 2 hours
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
{ loginRequestId, updatedAt, expireThreshold: expire },
|
||||||
|
"Checking login request expiration"
|
||||||
|
)
|
||||||
|
|
||||||
if (updatedAt < expire) {
|
if (updatedAt < expire) {
|
||||||
|
logger.warn(
|
||||||
|
{ loginRequestId, updatedAt, expireThreshold: expire },
|
||||||
|
"Login request expired, cleaning up"
|
||||||
|
)
|
||||||
deleteLoginRequest(loginRequestId) // cleanup in background
|
deleteLoginRequest(loginRequestId) // cleanup in background
|
||||||
throw httpError(498, "login request expired")
|
throw httpError(498, "login request expired")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.info({ loginRequestId }, "Login request is valid and not expired")
|
||||||
|
|
||||||
let userId
|
let userId
|
||||||
|
logger.info({ loginRequestId, type }, "Resolving user ID by login type")
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "phone_number": {
|
case "phone_number": {
|
||||||
|
logger.debug(
|
||||||
|
{ loginRequestId, phoneNumberId: userLoginRequest.phoneNumberId },
|
||||||
|
"Looking up user by phone number"
|
||||||
|
)
|
||||||
const [phoneNumber] = await sql`
|
const [phoneNumber] = await sql`
|
||||||
SELECT
|
SELECT
|
||||||
"user_id" as "userId"
|
"user_id" as "userId"
|
||||||
|
@ -51,10 +82,29 @@ module.exports = async function ({ services: { signJwt } }) {
|
||||||
WHERE
|
WHERE
|
||||||
"id" = ${userLoginRequest.phoneNumberId}
|
"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
|
userId = phoneNumber.userId
|
||||||
|
logger.debug(
|
||||||
|
{
|
||||||
|
loginRequestId,
|
||||||
|
userId,
|
||||||
|
phoneNumberId: userLoginRequest.phoneNumberId,
|
||||||
|
},
|
||||||
|
"User resolved via phone number"
|
||||||
|
)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case "email": {
|
case "email": {
|
||||||
|
logger.debug(
|
||||||
|
{ loginRequestId, emailId: userLoginRequest.emailId },
|
||||||
|
"Looking up user by email"
|
||||||
|
)
|
||||||
const [email] = await sql`
|
const [email] = await sql`
|
||||||
SELECT
|
SELECT
|
||||||
"user_id" as "userId"
|
"user_id" as "userId"
|
||||||
|
@ -63,18 +113,35 @@ module.exports = async function ({ services: { signJwt } }) {
|
||||||
WHERE
|
WHERE
|
||||||
"id" = ${userLoginRequest.emailId}
|
"id" = ${userLoginRequest.emailId}
|
||||||
`
|
`
|
||||||
|
if (!email) {
|
||||||
|
logger.error(
|
||||||
|
{ loginRequestId, emailId: userLoginRequest.emailId },
|
||||||
|
"Email not found"
|
||||||
|
)
|
||||||
|
throw httpError(404, "Email not found")
|
||||||
|
}
|
||||||
userId = email.userId
|
userId = email.userId
|
||||||
|
logger.debug(
|
||||||
|
{ loginRequestId, userId, emailId: userLoginRequest.emailId },
|
||||||
|
"User resolved via email"
|
||||||
|
)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
|
logger.error({ loginRequestId, type }, "Invalid login request type")
|
||||||
throw httpError(400)
|
throw httpError(400)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.info({ loginRequestId }, "Cleaning up login request")
|
||||||
deleteLoginRequest(loginRequestId) // cleanup in background
|
deleteLoginRequest(loginRequestId) // cleanup in background
|
||||||
|
|
||||||
let deviceId = null
|
let deviceId = null
|
||||||
if (deviceUuid) {
|
if (deviceUuid) {
|
||||||
|
logger.debug(
|
||||||
|
{ loginRequestId, userId, deviceUuid },
|
||||||
|
"Looking up device for user"
|
||||||
|
)
|
||||||
const [matchDevice] = await sql`
|
const [matchDevice] = await sql`
|
||||||
SELECT
|
SELECT
|
||||||
"id"
|
"id"
|
||||||
|
@ -87,10 +154,23 @@ module.exports = async function ({ services: { signJwt } }) {
|
||||||
|
|
||||||
if (matchDevice) {
|
if (matchDevice) {
|
||||||
deviceId = matchDevice.id
|
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()
|
const plainAuthToken = nanoid()
|
||||||
|
|
||||||
await sql`
|
await sql`
|
||||||
INSERT INTO "auth_token" ("auth_token", "user_id", "device_id")
|
INSERT INTO "auth_token" ("auth_token", "user_id", "device_id")
|
||||||
VALUES (${plainAuthToken}, ${userId}, ${deviceId})
|
VALUES (${plainAuthToken}, ${userId}, ${deviceId})
|
||||||
|
@ -99,8 +179,18 @@ module.exports = async function ({ services: { signJwt } }) {
|
||||||
"auth_token" = ${plainAuthToken}, "user_id" = ${userId}
|
"auth_token" = ${plainAuthToken}, "user_id" = ${userId}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
{ loginRequestId, userId, deviceId },
|
||||||
|
"Auth token stored in database"
|
||||||
|
)
|
||||||
|
|
||||||
const authTokenJwt = await signJwt({ authToken: plainAuthToken })
|
const authTokenJwt = await signJwt({ authToken: plainAuthToken })
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
{ loginRequestId, userId, deviceId },
|
||||||
|
"Login confirmation completed successfully"
|
||||||
|
)
|
||||||
|
|
||||||
return { authTokenJwt }
|
return { authTokenJwt }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue