import React, {useRef, useState, useEffect, useLayoutEffect} from 'react'; import { useTheme } from '@material-ui/core/styles'; import { v4 as uuidv4 } from 'uuid'; import { TextField, Drawer, Button, Paper, Grid, Tabs, InputAdornment, Tab, ButtonBase, Tooltip, Select, MenuItem, Divider, Dialog, Modal, DialogActions, DialogTitle, InputLabel, DialogContent, FormControl, IconButton, Menu, Input, FormGroup, FormControlLabel, Typography, Checkbox, Breadcrumbs, CircularProgress, Switch, Fade } from '@material-ui/core'; import { LockOpen as LockOpenIcon } from '@material-ui/icons'; const AuthenticationOauth2 = (props) => { const { saveWorkflow, selectedApp, workflow, selectedAction, authenticationType, getAppAuthentication, appAuthentication, setSelectedAction, setNewAppAuth, setAuthenticationModalOpen} = props; const theme = useTheme(); //const [update, setUpdate] = React.useState("|") const [defaultConfigSet, setDefaultConfigSet] = React.useState(authenticationType.client_id !== undefined && authenticationType.client_id !== null && authenticationType.client_id.length > 0 && authenticationType.client_secret !== undefined && authenticationType.client_secret !== null && authenticationType.client_secret.length > 0) const [clientId, setClientId] = React.useState(defaultConfigSet ? authenticationType.client_id : "") const [clientSecret, setClientSecret] = React.useState(defaultConfigSet ? authenticationType.client_secret : "") const [buttonClicked, setButtonClicked] = React.useState(false) const [manuallyConfigure, setManuallyConfigure] = React.useState(false) const [authenticationOption, setAuthenticationOptions] = React.useState({ app: JSON.parse(JSON.stringify(selectedApp)), fields: {}, label: "", usage: [{ workflow_id: workflow.id, }], id: uuidv4(), active: true, }) if (selectedApp.authentication === undefined) { return null } const handleOauth2Request = (client_id, client_secret) => { setButtonClicked(true) //if (authenticationType.type === "oauth2" && authenticationType.redirect_uri !== undefined && authenticationType.redirect_uri !== null) { // These are test credentials //const client_id = "dae24316-4bec-4832-b660-4cba6dc2477b" //const client_secret = "._Qu3EvYY-OW_D57uy79qwEo.32qD6.l0z" const authentication_url = authenticationType.token_uri const resources = "UserAuthenticationMethod.ReadWrite.All" if (authenticationType.scope !== undefined && authenticationType.scope !== null) { console.log("EDIT SCOPE!") } console.log(window.location) //const isCloud = window.location.host === "localhost:3002" || window.location.host === "shuffler.io" const redirectUri = `${window.location.protocol}//${window.location.host}/set_authentication` const state = `workflow_id%3D${workflow.id}%26reference_action_id%3d${selectedAction.app_id}%26app_name%3d${selectedAction.app_name}%26app_id%3d${selectedAction.app_id}%26app_version%3d${selectedAction.app_version}%26authentication_url%3d${authentication_url}%26scope%3d${resources}%26client_id%3d${client_id}%26client_secret%3d${client_secret}` const url = `${authenticationType.redirect_uri}?client_id=${client_id}&redirect_uri=${redirectUri}&response_type=code&scope=${resources}&state=${state}` // &resource=https%3A%2F%2Fgraph.microsoft.com& // FIXME: Awful, but works for prototyping // How can we get a callback properly realtime? // How can we properly try-catch without breaks on error? try { var newwin = window.open(url, "", "width=400,height=200") //console.log(newwin) var open = true const timer = setInterval(() => { if (newwin.closed) { clearInterval(timer); //alert('"Secure Payment" window closed!'); getAppAuthentication(true, true) setTimeout(() => { console.log("APPAUTH: ", appAuthentication) setAuthenticationModalOpen(false) }, 1500) } }, 1000); //do { // setTimeout(() => { // console.log(newwin) // console.log("CLOSED", newwin.closed) // if (newwin.closed) { // open = false // } // }, 1000) //} //while(open === true) } catch (e) { alert.error("Failed authentication - probably bad credentials. Try again") setButtonClicked(false) } return //do { //} while ( } authenticationOption.app.actions = [] for (var key in selectedApp.authentication.parameters) { if (authenticationOption.fields[selectedApp.authentication.parameters[key].name] === undefined) { authenticationOption.fields[selectedApp.authentication.parameters[key].name] = "" } } const handleSubmitCheck = () => { console.log("NEW AUTH: ", authenticationOption) if (authenticationOption.label.length === 0) { authenticationOption.label = `Auth for ${selectedApp.name}` //alert.info("Label can't be empty") //return } // Automatically mapping fields that already exist (predefined). // Warning if fields are NOT filled for (var key in selectedApp.authentication.parameters) { if (authenticationOption.fields[selectedApp.authentication.parameters[key].name].length === 0) { if (selectedApp.authentication.parameters[key].value !== undefined && selectedApp.authentication.parameters[key].value !== null && selectedApp.authentication.parameters[key].value.length > 0) { authenticationOption.fields[selectedApp.authentication.parameters[key].name] = selectedApp.authentication.parameters[key].value } else { if (selectedApp.authentication.parameters[key].schema.type === "bool") { authenticationOption.fields[selectedApp.authentication.parameters[key].name] = "false" } else { alert.info("Field "+selectedApp.authentication.parameters[key].name+" can't be empty") return } } } } console.log("Action: ", selectedAction) selectedAction.authentication_id = authenticationOption.id selectedAction.selectedAuthentication = authenticationOption if (selectedAction.authentication === undefined || selectedAction.authentication === null) { selectedAction.authentication = [authenticationOption] } else { selectedAction.authentication.push(authenticationOption) } setSelectedAction(selectedAction) var newAuthOption = JSON.parse(JSON.stringify(authenticationOption)) var newFields = [] for (const key in newAuthOption.fields) { const value = newAuthOption.fields[key] newFields.push({ key: key, value: value, }) } console.log("FIELDS: ", newFields) newAuthOption.fields = newFields setNewAppAuth(newAuthOption) //appAuthentication.push(newAuthOption) //setAppAuthentication(appAuthentication) // //if (configureWorkflowModalOpen) { // setSelectedAction({}) //} //setUpdate(authenticationOption.id) /* {selectedAction.authentication.map(data => ( */ } if (authenticationOption.label === null || authenticationOption.label === undefined) { authenticationOption.label = selectedApp.name+" authentication" } //console.log( return (
Oauth2 requires a client ID and secret to authenticate. This is usually made in the remote system. Learn more about Oauth2 with Shuffle
{/* { authenticationOption.label = event.target.value }} /> */} {!manuallyConfigure ? null : { setClientId(event.target.value) //authenticationOption.label = event.target.value }} /> { setClientSecret(event.target.value) //authenticationOption.label = event.target.value }} /> } {defaultConfigSet ? ... or : null}
) } export default AuthenticationOauth2