Skip to content

Commit

Permalink
Login with phone number (#93)
Browse files Browse the repository at this point in the history
- added sms-46elks and sms-twilio plugins
- changed auth-otp to handle otp via sms
     - added whitelisted country codes
- changed loginRequest and loginConfirm to emailLoginRequest and
emailLoginConfirm
  • Loading branch information
Ryiguchi authored Jun 3, 2024
1 parent 17be554 commit acdedbd
Show file tree
Hide file tree
Showing 59 changed files with 1,625 additions and 675 deletions.
11 changes: 11 additions & 0 deletions .changeset/itchy-owls-obey.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@zemble/auth-otp": patch
"@zemble/auth": patch
"@zemble/cms-users": patch
"@zemble/cms": patch
"cms-ui": patch
"minimal": patch
"supplement-stack": patch
---

Login with phone number
8 changes: 4 additions & 4 deletions apps/cms-ui/app/(auth)/login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ type TextInputHandles = Pick<TextInputNative, 'focus' | 'clear' | 'blur' | 'isFo

export const LoginConfirmMutation = graphql(`
mutation LoginConfirm($email: String!, $code: String!) {
loginConfirm(email: $email, code: $code) {
loginConfirmWithEmail(email: $email, code: $code) {
__typename
... on LoginConfirmSuccessfulResponse {
bearerToken
Expand All @@ -32,7 +32,7 @@ export const LoginConfirmMutation = graphql(`

export const LoginRequestMutation = graphql(`
mutation LoginRequest($email: String!) {
loginRequest(email: $email) {
loginRequestWithEmail(email: $email) {
__typename
... on Error {
message
Expand All @@ -55,8 +55,8 @@ const Login = () => {
const doConfirm = useCallback(async () => {
const { data } = await loginConfirm({ email, code })

if (data?.loginConfirm.__typename === 'LoginConfirmSuccessfulResponse') {
setToken(data.loginConfirm.bearerToken)
if (data?.loginConfirmWithEmail.__typename === 'LoginConfirmSuccessfulResponse') {
setToken(data.loginConfirmWithEmail.bearerToken)
}
}, [
email, code, loginConfirm, setToken,
Expand Down
67 changes: 67 additions & 0 deletions apps/minimal/.env.dev
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@

PUBLIC_KEY='-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArRjgBxq2WSsxHvXeM0Gu
fa1s1Ovoo3UQfd239dO+vxc8H4FbO60KYkVwSPwTfqOvre5pp5XkyFFhHonNNrQa
qAzPCihYhIwvL0H7CvOaQqDCDGt5+UZnQ1gHxng9zTDOP3NKtmZ6d9VDHydK+5tW
3sObf2aLXA19W1r4s++SzWtr1zkHs+NJ2L8m0Jm/mDu45n1pz4eKZK43iTwUcpRz
SPfreK8lzKulhP+Ehr+1o6Px3y5C4uHdl0FN6B6bdbR/OfQuCDQ+KBIeW13epEep
0W675WIUF7c7lCyzstskRPkB9SITYTjvzEesWarQo9C9vr22AGCF70JJbuGoDAk2
TpPEA1S4bZWZxwdTTV6Ys9iQd4dSWh39G+rnt7I2QMJhHmGnYA/PSDGxyDd9y5ub
prKGX5UERdGAPEZxgJjCRFhOZgCsYXMewg246oUpMe8Efvi67DqZqPHJmJK2++Cz
nEhrZXqEvSSpVvnP89RXutLCvOdFeWxx4NlPpjwI0Whs+JPrpFuqXKhRX7cbk33X
zD79jNdVXZEWDCwOkENeDqfPM5KiQD3y6geDAFghBge9Xwb9FMPCJ9GV2Zt2cbFL
PmS5NlwkjP5O9jHswPFZdsPT5oud/zrNB5OYf2J1qyUl0y6tu7ryH697p9PJECXP
pduX76EzFL7Qe9r9jlUNCm8CAwEAAQ==
-----END PUBLIC KEY-----'
PRIVATE_KEY='-----BEGIN PRIVATE KEY-----
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
DmxKOUbG7CHn8nB21sC7cvKKEIxoCg==
-----END PRIVATE KEY-----'
67 changes: 67 additions & 0 deletions apps/minimal/.env.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@

PUBLIC_KEY='-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArRjgBxq2WSsxHvXeM0Gu
fa1s1Ovoo3UQfd239dO+vxc8H4FbO60KYkVwSPwTfqOvre5pp5XkyFFhHonNNrQa
qAzPCihYhIwvL0H7CvOaQqDCDGt5+UZnQ1gHxng9zTDOP3NKtmZ6d9VDHydK+5tW
3sObf2aLXA19W1r4s++SzWtr1zkHs+NJ2L8m0Jm/mDu45n1pz4eKZK43iTwUcpRz
SPfreK8lzKulhP+Ehr+1o6Px3y5C4uHdl0FN6B6bdbR/OfQuCDQ+KBIeW13epEep
0W675WIUF7c7lCyzstskRPkB9SITYTjvzEesWarQo9C9vr22AGCF70JJbuGoDAk2
TpPEA1S4bZWZxwdTTV6Ys9iQd4dSWh39G+rnt7I2QMJhHmGnYA/PSDGxyDd9y5ub
prKGX5UERdGAPEZxgJjCRFhOZgCsYXMewg246oUpMe8Efvi67DqZqPHJmJK2++Cz
nEhrZXqEvSSpVvnP89RXutLCvOdFeWxx4NlPpjwI0Whs+JPrpFuqXKhRX7cbk33X
zD79jNdVXZEWDCwOkENeDqfPM5KiQD3y6geDAFghBge9Xwb9FMPCJ9GV2Zt2cbFL
PmS5NlwkjP5O9jHswPFZdsPT5oud/zrNB5OYf2J1qyUl0y6tu7ryH697p9PJECXP
pduX76EzFL7Qe9r9jlUNCm8CAwEAAQ==
-----END PUBLIC KEY-----'
PRIVATE_KEY='-----BEGIN PRIVATE KEY-----
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
DmxKOUbG7CHn8nB21sC7cvKKEIxoCg==
-----END PRIVATE KEY-----'
1 change: 1 addition & 0 deletions apps/minimal/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.env*
5 changes: 5 additions & 0 deletions apps/minimal/app.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Bull from '@zemble/bull'
import { createApp } from '@zemble/core'
import Resend from '@zemble/email-resend'
import GraphQL from '@zemble/graphql'
import GraphQLLogger from '@zemble/logger-graphql'
import Migrations from '@zemble/migrations'
Expand All @@ -26,5 +27,9 @@ export default createApp({
Migrations.configure({
createAdapter: () => dryrunAdapter,
}),
Resend.configure({
RESEND_API_KEY: process.env['RESEND_API_KEY'],
disable: false,
}),
],
})
5 changes: 5 additions & 0 deletions apps/minimal/graphql/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ type Query {

type Mutation {
randomNumber: Int!
# sendSms(
# from: String!,
# to: String!,
# message: String!,
# ): Boolean!
}

type Subscription {
Expand Down
14 changes: 9 additions & 5 deletions apps/minimal/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,19 @@
},
"license": "ISC",
"dependencies": {
"@zemble/auth": "workspace:*",
"@zemble/auth-otp": "workspace:*",
"@zemble/bull": "workspace:*",
"@zemble/bun": "workspace:*",
"@zemble/core": "workspace:*",
"@zemble/email-resend": "workspace:*",
"@zemble/graphql": "workspace:*",
"@zemble/logger-graphql": "workspace:*",
"@zemble/migrations": "workspace:*",
"@zemble/bun": "workspace:*",
"@zemble/auth": "workspace:*",
"@zemble/routes": "workspace:*",
"@zemble/pino": "workspace:*",
"@zemble/bull": "workspace:*",
"@zemble/logger-graphql": "workspace:*"
"@zemble/routes": "workspace:*",
"@zemble/sms-46elks": "workspace:*",
"@zemble/sms-twilio": "workspace:*"
},
"devDependencies": {
"@tsconfig/node20": "^20.1.4",
Expand Down
2 changes: 1 addition & 1 deletion apps/supplement-stack/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void bunRunner({
},
}),
AuthOTP.configure({
from: { email: '[email protected]' },
fromEmail: { email: '[email protected]' },
generateTokenContents: async ({ email }) => {
const user = await Users.findOneAndUpdate({ email }, {
$set: {
Expand Down
Loading

0 comments on commit acdedbd

Please sign in to comment.