diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/axios_client.js | 6 | ||||
-rw-r--r-- | src/constants.js | 1 | ||||
-rw-r--r-- | src/session.js | 92 |
3 files changed, 62 insertions, 37 deletions
diff --git a/src/axios_client.js b/src/axios_client.js new file mode 100644 index 0000000..fd7325c --- /dev/null +++ b/src/axios_client.js @@ -0,0 +1,6 @@ +import { wrapper } from "axios-cookiejar-support"; +import { CookieJar } from "tough-cookie"; +import axios from "axios"; + +const jar = new CookieJar(); +export const client = wrapper(axios.create({ jar, withCredentials: true })); diff --git a/src/constants.js b/src/constants.js index 5087f3f..a0b09e5 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,5 +1,6 @@ export const AGGIETIME_URI = "https://aggietimeultra.usu.edu"; export const LOGIN_PATH = "api/v1/auth/login"; +export const USER_PATH = "api/v1/auth/get_user_info"; export const EXECUTION_SELECTOR = "input[type=hidden][name=execution]"; export const DUO_IFRAME_SELECTOR = "#duo_iframe"; export const DUO_FACTOR = "Duo Push"; diff --git a/src/session.js b/src/session.js index ae6d593..0206731 100644 --- a/src/session.js +++ b/src/session.js @@ -1,14 +1,17 @@ import { AGGIETIME_URI, LOGIN_PATH, + USER_PATH, DUO_IFRAME_SELECTOR, DUO_FACTOR, DUO_INPUT_FIELD_SELECTORS, EXECUTION_SELECTOR, } from "./constants.js"; +import { client } from "./axios_client.js"; + import { parse } from "node-html-parser"; -import axios from "axios"; +//import axios from "axios"; const make_auth_params = (username, password, execution) => new URLSearchParams({ @@ -31,10 +34,10 @@ const push_duo_get_cookie = async ( "data-sig-request", "src", ].map((attr) => duo_iframe_obj.getAttribute(attr)); - const transaction_id = duo_sig.split(":")[0]; + const transaction_id = duo_sig.split(":").at(0); + const app = duo_sig.split(":APP").at(-1); - const duo = axios.create({ - withCredentials: true, + const duo = client.create({ baseURL: `https://${duo_host}`, }); @@ -62,63 +65,78 @@ const push_duo_get_cookie = async ( response: { txid }, } = await duo.post("/frame/prompt", push_params).then(({ data }) => data); - return await wait_approve_duo(duo, sid, txid); + const { cookie, parent } = await wait_approve_duo_cookie_resp(duo, sid, txid); + return { duo_signed_resp: cookie + ":APP" + app, parent }; }; -const wait_approve_duo = async (duo, sid, txid) => { - // First status to confirm device was pushed to - // Second to long-poll for approval :3 +const wait_approve_duo_cookie_resp = async (duo, sid, txid) => { const status_params = new URLSearchParams({ sid, txid, }); - const data = await duo - .post("/frame/status", status_params) - .then(async ({ data }) => { - if (data.stat === "OK" && data.response.status_code === "pushed") - return await duo - .post("/frame/status", status_params) - .then(({ data }) => data); - return data; - }); - + // First status to confirm device was pushed to + // Second to long-poll for approval :3 const { response: { result_url }, - } = data; + } = await duo.post("/frame/status", status_params).then(async ({ data }) => { + if (data.stat === "OK" && data.response.status_code === "pushed") + return await duo + .post("/frame/status", status_params) + .then(({ data }) => data); + return data; + }); - console.log(data); + const { + response: { cookie, parent }, + } = await duo + .post(result_url, new URLSearchParams({ sid })) + .then(({ data }) => data); - return await duo.post(result_url, new URLSearchParams({ sid })); + return { cookie, parent }; }; +const get_execution = (cas_root) => {}; + export const login = async (username, password) => { - const login_page_promise = axios.get(`${AGGIETIME_URI}/${LOGIN_PATH}`); + const login_page_promise = client.get(`${AGGIETIME_URI}/${LOGIN_PATH}`); const { request: { res: { responseUrl: response_url }, }, } = await login_page_promise; - const cas_root = await login_page_promise.then(({ data }) => parse(data)); - const execution = cas_root + let cas_root = await login_page_promise.then(({ data }) => parse(data)); + const login_execution = cas_root .querySelector(EXECUTION_SELECTOR) .getAttribute("value"); - const duo_iframe_obj = await axios - .post(response_url, make_auth_params(username, password, execution)) - .then(({ data }) => parse(data).querySelector(DUO_IFRAME_SELECTOR)); + cas_root = await client + .post(response_url, make_auth_params(username, password, login_execution)) + .then(({ data }) => parse(data)); + const authed_execution = cas_root + .querySelector(EXECUTION_SELECTOR) + .getAttribute("value"); - const cookie = await push_duo_get_cookie( - duo_iframe_obj, - response_url, - username, - password, - execution - ); + const duo_iframe_obj = cas_root.querySelector(DUO_IFRAME_SELECTOR); + + const { duo_signed_resp, parent: signed_response_url } = + await push_duo_get_cookie( + duo_iframe_obj, + response_url, + username, + password, + login_execution + ); - console.log(cookie); - console.log(cookie.data); + const jwt_cookie_set = await client.post( + signed_response_url, + new URLSearchParams({ + execution: authed_execution, + signedDuoResponse: duo_signed_resp, + _eventId: "submit", + }) + ); - return cookie; + return jwt_cookie_set; }; |