Skip to content

Commit

Permalink
Merge pull request #74 from CityOfLosAngeles/mfa-sms-phone
Browse files Browse the repository at this point in the history
MFA SMS Flow
  • Loading branch information
cbhernan authored Jan 31, 2024
2 parents 886b816 + d00c593 commit af14c07
Show file tree
Hide file tree
Showing 271 changed files with 662 additions and 143 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/firebase-hosting-pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ on:
- 'web/**'
jobs:
build_and_preview:
if: '${{ github.event.pull_request.head.repo.full_name == github.repository }}'
if: '${{ github.event.pull_request.head.repo.full_name == github.repository &&
github.event.pull_request.draft == false }}'
runs-on: ubuntu-latest
environment: development
steps:
Expand Down
2 changes: 1 addition & 1 deletion firebase.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"region": "us-central1"
},
{
"source": "**",
"source": "/auth0/**",
"function": "auth0",
"region": "us-central1"
}
Expand Down
58 changes: 47 additions & 11 deletions functions/auth0/api/auth0.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,19 +156,36 @@ const authMethods = onRequest(async (req, res) => {
}
});

const enrollOTP = onRequest(async (req, res) => {
const enrollMFA = onRequest(async (req, res) => {
const body = req.body;

const {
email,
password,
mfaFactor = '',
number,
channel
} = body;

try {
const validateResponse = await authorizeUser(
body.email,
body.password,
email,
password,
"/mfa/"
);

if (validateResponse.status === 200) {
const mfaToken = validateResponse?.data?.access_token;

let additionalData = {};

if (mfaFactor == "oob") {
additionalData = {
"oob_channels": [channel],
"phone_number": number
}
}

const otpRequest = {
method: "POST",
url: `https://${auth0Domain}/mfa/associate`,
Expand All @@ -177,7 +194,8 @@ const enrollOTP = onRequest(async (req, res) => {
Authorization: `Bearer ${mfaToken}`,
},
data: {
authenticator_types: ["otp"],
authenticator_types: [mfaFactor],
...additionalData
},
};

Expand All @@ -202,22 +220,40 @@ const enrollOTP = onRequest(async (req, res) => {
}
});

const confirmOTP = onRequest(async (req, res) => {
const confirmMFA = onRequest(async (req, res) => {
const body = req.body;

const {
mfaToken,
userOtpCode = '',
oobCode = '',
} = body;

try {
const {mfaToken, userOtpCode} = body;

let additionalData = {};

if (oobCode.length) {
additionalData = {
oob_code: `${oobCode}`,
binding_code: `${userOtpCode}`
}
} else {
additionalData = {
otp: `${userOtpCode}`
}
}

const options = {
method: "POST",
url: `https://${auth0Domain}/oauth/token`,
headers: {"content-type": "application/x-www-form-urlencoded"},
data: new URLSearchParams({
grant_type: "http://auth0.com/oauth/grant-type/mfa-otp",
grant_type: `http://auth0.com/oauth/grant-type/${oobCode.length ? 'mfa-oob' : 'mfa-otp'}`,
client_id: `${auth0ClientId}`,
mfa_token: `${mfaToken}`,
client_secret: `${auth0ClientSecret}`,
otp: `${userOtpCode}`,
mfa_token: `${mfaToken}`,
...additionalData
}),
};

Expand Down Expand Up @@ -268,7 +304,7 @@ module.exports = {
updateUser,
updatePassword,
authMethods,
enrollOTP,
confirmOTP,
enrollMFA,
confirmMFA,
unenrollMFA,
};
22 changes: 11 additions & 11 deletions functions/auth0/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,24 @@ const admin = require("firebase-admin");
const express = require("express");

admin.initializeApp();
const auth0 = express();
const app = express();

const {
updateUser,
updatePassword,
enrollOTP,
confirmOTP,
enrollMFA,
confirmMFA,
authMethods,
unenrollMFA
} = require("./api/auth0");

auth0.use(express.json());
app.use(express.json());

auth0.post("/updateUser", updateUser);
auth0.post("/updatePassword", updatePassword);
auth0.post("/enrollOTP", enrollOTP);
auth0.post("/confirmOTP", confirmOTP);
auth0.post("/authMethods", authMethods);
auth0.post("/unenrollMFA", unenrollMFA);
app.post("/auth0/updateUser", updateUser);
app.post("/auth0/updatePassword", updatePassword);
app.post("/auth0/enrollMFA", enrollMFA);
app.post("/auth0/confirmMFA", confirmMFA);
app.post("/auth0/authMethods", authMethods);
app.post("/auth0/unenrollMFA", unenrollMFA);

exports.auth0 = onRequest(auth0);
exports.auth0 = onRequest(app);
2 changes: 1 addition & 1 deletion functions/auth0/utils/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ module.exports = {
auth0ClientId,
auth0ClientSecret,
auth0Domain
};
};
10 changes: 5 additions & 5 deletions functions/maps/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ const axios = require("axios");
const express = require("express");

admin.initializeApp();
const maps = express();
const app = express();

maps.use(express.json());
app.use(express.json());

const corsProxyAutofill = onRequest(async (req, res) => {

Expand All @@ -16,7 +16,7 @@ const corsProxyPlaceDetails = onRequest(async (req, res) => {

});

maps.get("/corsProxyPlaceDetails", corsProxyPlaceDetails);
maps.get("/corsProxyAutofill", corsProxyAutofill);
app.get("/maps/corsProxyPlaceDetails", corsProxyPlaceDetails);
app.get("/maps/corsProxyAutofill", corsProxyAutofill);

exports.maps = onRequest(maps);
exports.maps = onRequest(app);
Binary file added images/flags/ad.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/ae.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/af.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/ag.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/ai.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/al.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/am.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/an.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/ao.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/aq.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/ar.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/as.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/at.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/au.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/aw.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/ax.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/az.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/ba.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/bb.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/bd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/be.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/bf.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/bg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/bh.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/bi.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flags/bj.png
Binary file added images/flags/bl.png
Binary file added images/flags/bm.png
Binary file added images/flags/bn.png
Binary file added images/flags/bo.png
Binary file added images/flags/bq.png
Binary file added images/flags/br.png
Binary file added images/flags/bs.png
Binary file added images/flags/bt.png
Binary file added images/flags/bv.png
Binary file added images/flags/bw.png
Binary file added images/flags/by.png
Binary file added images/flags/bz.png
Binary file added images/flags/ca.png
Binary file added images/flags/cc.png
Binary file added images/flags/cd.png
Binary file added images/flags/cf.png
Binary file added images/flags/cg.png
Binary file added images/flags/ch.png
Binary file added images/flags/ci.png
Binary file added images/flags/ck.png
Binary file added images/flags/cl.png
Binary file added images/flags/cm.png
Binary file added images/flags/cn.png
Binary file added images/flags/co.png
Binary file added images/flags/cr.png
Binary file added images/flags/cu.png
Binary file added images/flags/cv.png
Binary file added images/flags/cw.png
Binary file added images/flags/cx.png
Binary file added images/flags/cy.png
Binary file added images/flags/cz.png
Binary file added images/flags/de.png
Binary file added images/flags/dj.png
Binary file added images/flags/dk.png
Binary file added images/flags/dm.png
Binary file added images/flags/do.png
Binary file added images/flags/dz.png
Binary file added images/flags/ec.png
Binary file added images/flags/ee.png
Binary file added images/flags/eg.png
Binary file added images/flags/eh.png
Binary file added images/flags/er.png
Binary file added images/flags/es.png
Binary file added images/flags/et.png
Binary file added images/flags/eu.png
Binary file added images/flags/fi.png
Binary file added images/flags/fj.png
Binary file added images/flags/fk.png
Binary file added images/flags/fm.png
Binary file added images/flags/fo.png
Binary file added images/flags/fr.png
Binary file added images/flags/ga.png
Binary file added images/flags/gb-eng.png
Binary file added images/flags/gb-nir.png
Binary file added images/flags/gb-sct.png
Binary file added images/flags/gb-wls.png
Binary file added images/flags/gb.png
Binary file added images/flags/gd.png
Binary file added images/flags/ge.png
Binary file added images/flags/gf.png
Binary file added images/flags/gg.png
Binary file added images/flags/gh.png
Binary file added images/flags/gi.png
Binary file added images/flags/gl.png
Binary file added images/flags/gm.png
Binary file added images/flags/gn.png
Binary file added images/flags/gp.png
Binary file added images/flags/gq.png
Binary file added images/flags/gr.png
Binary file added images/flags/gs.png
Binary file added images/flags/gt.png
Binary file added images/flags/gu.png
Binary file added images/flags/gw.png
Binary file added images/flags/gy.png
Binary file added images/flags/hk.png
Binary file added images/flags/hm.png
Binary file added images/flags/hn.png
Binary file added images/flags/hr.png
Binary file added images/flags/ht.png
Binary file added images/flags/hu.png
Binary file added images/flags/id.png
Binary file added images/flags/ie.png
Binary file added images/flags/il.png
Binary file added images/flags/im.png
Binary file added images/flags/in.png
Binary file added images/flags/io.png
Binary file added images/flags/iq.png
Binary file added images/flags/ir.png
Binary file added images/flags/is.png
Binary file added images/flags/it.png
Binary file added images/flags/je.png
Binary file added images/flags/jm.png
Binary file added images/flags/jo.png
Binary file added images/flags/jp.png
Binary file added images/flags/ke.png
Binary file added images/flags/kg.png
Binary file added images/flags/kh.png
Binary file added images/flags/ki.png
Binary file added images/flags/km.png
Binary file added images/flags/kn.png
Binary file added images/flags/kp.png
Binary file added images/flags/kr.png
Binary file added images/flags/kw.png
Binary file added images/flags/ky.png
Binary file added images/flags/kz.png
Binary file added images/flags/la.png
Binary file added images/flags/lb.png
Binary file added images/flags/lc.png
Binary file added images/flags/li.png
Binary file added images/flags/lk.png
Binary file added images/flags/lr.png
Binary file added images/flags/ls.png
Binary file added images/flags/lt.png
Binary file added images/flags/lu.png
Binary file added images/flags/lv.png
Binary file added images/flags/ly.png
Binary file added images/flags/ma.png
Binary file added images/flags/mc.png
Binary file added images/flags/md.png
Binary file added images/flags/me.png
Binary file added images/flags/mf.png
Binary file added images/flags/mg.png
Binary file added images/flags/mh.png
Binary file added images/flags/mk.png
Binary file added images/flags/ml.png
Binary file added images/flags/mm.png
Binary file added images/flags/mn.png
Binary file added images/flags/mo.png
Binary file added images/flags/mp.png
Binary file added images/flags/mq.png
Binary file added images/flags/mr.png
Binary file added images/flags/ms.png
Binary file added images/flags/mt.png
Binary file added images/flags/mu.png
Binary file added images/flags/mv.png
Binary file added images/flags/mw.png
Binary file added images/flags/mx.png
Binary file added images/flags/my.png
Binary file added images/flags/mz.png
Binary file added images/flags/na.png
Binary file added images/flags/nc.png
Binary file added images/flags/ne.png
Binary file added images/flags/nf.png
Binary file added images/flags/ng.png
Binary file added images/flags/ni.png
Binary file added images/flags/nl.png
Binary file added images/flags/no.png
Binary file added images/flags/np.png
Binary file added images/flags/nr.png
Binary file added images/flags/nu.png
Binary file added images/flags/nz.png
Binary file added images/flags/om.png
Binary file added images/flags/pa.png
Binary file added images/flags/pe.png
Binary file added images/flags/pf.png
Binary file added images/flags/pg.png
Binary file added images/flags/ph.png
Binary file added images/flags/pk.png
Binary file added images/flags/pl.png
Binary file added images/flags/pm.png
Binary file added images/flags/pn.png
Binary file added images/flags/pr.png
Binary file added images/flags/ps.png
Binary file added images/flags/pt.png
Binary file added images/flags/pw.png
Binary file added images/flags/py.png
Binary file added images/flags/qa.png
Binary file added images/flags/re.png
Binary file added images/flags/ro.png
Binary file added images/flags/rs.png
Binary file added images/flags/ru.png
Binary file added images/flags/rw.png
Binary file added images/flags/sa.png
Binary file added images/flags/sb.png
Binary file added images/flags/sc.png
Binary file added images/flags/sd.png
Binary file added images/flags/se.png
Binary file added images/flags/sg.png
Binary file added images/flags/sh.png
Binary file added images/flags/si.png
Binary file added images/flags/sj.png
Binary file added images/flags/sk.png
Binary file added images/flags/sl.png
Binary file added images/flags/sm.png
Binary file added images/flags/sn.png
Binary file added images/flags/so.png
Binary file added images/flags/sr.png
Binary file added images/flags/ss.png
Binary file added images/flags/st.png
Binary file added images/flags/sv.png
Binary file added images/flags/sx.png
Binary file added images/flags/sy.png
Binary file added images/flags/sz.png
Binary file added images/flags/tc.png
Binary file added images/flags/td.png
Binary file added images/flags/tf.png
Binary file added images/flags/tg.png
Binary file added images/flags/th.png
Binary file added images/flags/tj.png
Binary file added images/flags/tk.png
Binary file added images/flags/tl.png
Binary file added images/flags/tm.png
Binary file added images/flags/tn.png
Binary file added images/flags/to.png
Binary file added images/flags/tr.png
Binary file added images/flags/tt.png
Binary file added images/flags/tv.png
Binary file added images/flags/tw.png
Binary file added images/flags/tz.png
Binary file added images/flags/ua.png
Binary file added images/flags/ug.png
Binary file added images/flags/um.png
Binary file added images/flags/us.png
Binary file added images/flags/uy.png
Binary file added images/flags/uz.png
Binary file added images/flags/va.png
Binary file added images/flags/vc.png
Binary file added images/flags/ve.png
Binary file added images/flags/vg.png
Binary file added images/flags/vi.png
Binary file added images/flags/vn.png
Binary file added images/flags/vu.png
Binary file added images/flags/wf.png
Binary file added images/flags/ws.png
Binary file added images/flags/xk.png
Binary file added images/flags/ye.png
Binary file added images/flags/yt.png
Binary file added images/flags/za.png
Binary file added images/flags/zm.png
Binary file added images/flags/zw.png
6 changes: 3 additions & 3 deletions lib/controllers/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ abstract class Api {

void getAuthenticationMethods(final String userId);

void enrollAuthenticator(final Map<String, String> body);
void enrollMFA(final Map<String, String> body);

void confirmTOTP(final Map<String, String> body);
void confirmMFA(final Map<String, String> body);

void unenrollAuthenticator(final Map<String, String> body);
void unenrollMFA(final Map<String, String> body);
}
29 changes: 15 additions & 14 deletions lib/controllers/api_implementation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class UserApi extends Api {
final body = json.encode(user);

final response = await http.post(
Uri.parse('/updateUser'),
Uri.parse('/auth0/updateUser'),
headers: headers,
body: body
).timeout(const Duration(seconds: 15));
Expand Down Expand Up @@ -119,7 +119,7 @@ class UserApi extends Api {

try {
final request = await http.post(
Uri.parse('/updatePassword'),
Uri.parse('/auth0/updatePassword'),
headers: headers,
body: reqBody
);
Expand Down Expand Up @@ -151,7 +151,7 @@ class UserApi extends Api {

try {
final request = await http.post(
Uri.parse('/authMethods'),
Uri.parse('/auth0/authMethods'),
headers: headers,
body: reqBody
);
Expand All @@ -171,7 +171,7 @@ class UserApi extends Api {

@override
Future<Map<String, dynamic>>
enrollAuthenticator(final Map<String, String> body) async {
enrollMFA(final Map<String, String> body) async {
late Map<String, dynamic> response;

final headers = {
Expand All @@ -182,23 +182,25 @@ class UserApi extends Api {

try {
final request = await http.post(
Uri.parse('/enrollOTP'),
Uri.parse('/auth0/enrollMFA'),
headers: headers,
body: reqBody
);

final jsonBody = jsonDecode(request.body);
final barcode = jsonBody['barcode_uri'];
final token = jsonBody['token'];
final tokenSecret = jsonBody['secret'];
final barcode = jsonBody['barcode_uri'] ?? '';
final token = jsonBody['token'] ?? '';
final tokenSecret = jsonBody['secret'] ?? '';
final oobCode = jsonBody['oob_code'] ?? '';

if (request.statusCode == HttpStatus.ok) {
response = {
'status': request.statusCode,
'body': request.body,
'barcode': barcode,
'token': token,
'barcode_string': tokenSecret
'barcode_string': tokenSecret,
'oobCode': oobCode
};
} else {
throw ApiException(request.statusCode, request.body);
Expand All @@ -220,7 +222,7 @@ class UserApi extends Api {
}

@override
Future<ApiResponse> confirmTOTP(final Map<String, String> body) async {
Future<ApiResponse> confirmMFA(final Map<String, String> body) async {

final headers = {
'Content-Type': 'application/json'
Expand All @@ -230,7 +232,7 @@ class UserApi extends Api {

try {
final request = await http.post(
Uri.parse('/confirmOTP'),
Uri.parse('/auth0/confirmMFA'),
headers: headers,
body: reqBody
);
Expand All @@ -249,8 +251,7 @@ class UserApi extends Api {
}

@override
Future<ApiResponse> unenrollAuthenticator(final Map<String, String> body)
async {
Future<ApiResponse> unenrollMFA(final Map<String, String> body) async {

final headers = {
'Content-Type': 'application/json'
Expand All @@ -260,7 +261,7 @@ class UserApi extends Api {

try {
final request = await http.post(
Uri.parse('/unenrollMFA'),
Uri.parse('/auth0/unenrollMFA'),
headers: headers,
body: reqBody
);
Expand Down
Loading

0 comments on commit af14c07

Please sign in to comment.