51 lines
1.5 KiB
JavaScript
51 lines
1.5 KiB
JavaScript
import { gql, useLazyQuery } from "@apollo/client";
|
|
import Base62Str from "base62str";
|
|
import sha256 from "hash.js/lib/hash/sha/256";
|
|
import hmac from "hash.js/lib/hash/hmac";
|
|
import sendSMS from "~/lib/sms/sendSMS";
|
|
import { useSessionState } from "~/stores";
|
|
|
|
const base62 = Base62Str.createInstance();
|
|
|
|
async function generateCode(userId, signKey, type) {
|
|
const timestampInSeconds = Math.floor(Date.now() / 1000);
|
|
const signature = hmac(sha256, signKey)
|
|
.update(`${userId}.${timestampInSeconds}`)
|
|
.digest("hex");
|
|
return (
|
|
"AS_" +
|
|
type +
|
|
"_" +
|
|
base62.encodeStr(`${userId}.${timestampInSeconds}#${signature}`)
|
|
);
|
|
}
|
|
|
|
const GET_GENERATE_CODE_REQUIREMENTS = gql`
|
|
query getGenerateCodeRequirements($userId: Int!) {
|
|
selectManyAuthSignKey(where: { userId: { _eq: $userId } }) {
|
|
key
|
|
}
|
|
selectOneExternalPublicConfig(key: smsVerificationNumber) {
|
|
value
|
|
}
|
|
}
|
|
`;
|
|
|
|
export default function useSendAuthSMS() {
|
|
const [getGenerateCodeRequirements] = useLazyQuery(
|
|
GET_GENERATE_CODE_REQUIREMENTS,
|
|
);
|
|
const { userId } = useSessionState(["userId"]);
|
|
|
|
return async ({ body, smsType }) => {
|
|
const { data } = await getGenerateCodeRequirements({
|
|
variables: {
|
|
userId,
|
|
},
|
|
});
|
|
const verificationNumber = data.selectOneExternalPublicConfig.value;
|
|
const signKey = data.selectManyAuthSignKey[0].key;
|
|
const code = await generateCode(userId, signKey, smsType);
|
|
sendSMS([verificationNumber], body.replace(/\[CODE\]/g, code));
|
|
};
|
|
}
|