---
# System prepended metadata

title: SMS Auth

---

# SMS Auth

## Requirements

| Requirements | Solution |
| -------- | -------- | 
| sensitive user data protection | * user numbers store at Authy with Authy Users API |
| country codes limit ( eg JP, TW) | * Twilio Geo Permission; Rails form object validation |
| 2FA form: input user number | custom form with Rails form object |
| 2FA form: input pin number | custom form with Rails form object |
| 2FA SMS token generation & delivery | * Authy OTP API |
| 2FA verification | * Authy Verify API |

`*` service provided by Twilio/Authy


## User Attribtues Adjustments
``` ruby
[
  "id",
  "uid",
  "provider",
  "email",
  "name",
  "nickname",
  "user_token",
  "created_at",
  "updated_at",
  "active",
  "archived",
  "sign_in_count",
  "current_sign_in_at",
  "last_sign_in_at",
  "current_sign_in_ip",
  "last_sign_in_ip",
  "account_kit_id", #to be deprecated
  "sms_auth",
  "authy_id" #to be added
]
```


## Auth Flow
``` flow
st=>start: omniauth callback

e1=>end: chat page
1) login user

cond1=>condition: active user?

op1=>operation: user registration edit page
1) update nickname

op2=>operation: sms_auth_term page

op3=>operation: sms_auth page
1) user input number

op4=>inputoutput: Authy API
1) verify number
2) register user
3) response with auth_id

cond2=>condition: requset successful?

cond3=>condition: number valid?

e2=>end: sms_auth page
1) display error msg

op5=>inputoutput: Update user
1) update user's `authy_id`

cond4=>condition: authy_id duplicated?

op6=>inputoutput: Authy API
1) send sms with pin

cond5=>condition: request successful?

e3=>end: 500 page
1) Bugsnag notify

op7=>operation: verify page
1) user input pin

op8=>inputoutput: Authy API
1) verify pin

e4=>end: chat page
1) login user

cond6=>condition: request successful?

cond7=>condition: pin correct?

op9=>inputoutput: update user
1) sms_auth: true
2) active: true

st->cond1->
cond1(no)->op1->op2->op3->op4->cond2
cond1(yes)->e1

cond2(no)->e3
cond2(yes)->cond3

cond3(no)->e2
cond3(yes)->op5->cond4

cond4(yes)->e2
cond4(no)->op6->cond5

cond5(no)->e3
cond5(yes)->op7->op8->cond6

cond6(no)->e3
cond6(yes)->cond7

cond7(no)->op7
cond7(yes)->op9->e4
```

## Form Objects

| Models | Attributes |
| -------- | -------- |
| SmsRegistration | country_code, phone_number |
| SmsVerification | pin_number |


## Controllers

### SmsRegistrationController

| Actions | Main tasks |
| -------- | -------- |
| new | render `sms_registration#new` page with `SmsRegistration` instance |
| create | register authy user, deliver auth token |


### SmsVerificationController

| Actions | Main tasks |
| -------- | -------- |
| new | render `sms_verification#new` page with `SmsVerification` instance |
| create | verify auth token, activate user |