forked from extern/bruno
Added AWS SigV4 to collection auth
This commit is contained in:
parent
f781bd7d8a
commit
ba8bfc6d17
@ -34,6 +34,15 @@ const AuthMode = ({ collection }) => {
|
|||||||
<StyledWrapper>
|
<StyledWrapper>
|
||||||
<div className="inline-flex items-center cursor-pointer auth-mode-selector">
|
<div className="inline-flex items-center cursor-pointer auth-mode-selector">
|
||||||
<Dropdown onCreate={onDropdownCreate} icon={<Icon />} placement="bottom-end">
|
<Dropdown onCreate={onDropdownCreate} icon={<Icon />} placement="bottom-end">
|
||||||
|
<div
|
||||||
|
className="dropdown-item"
|
||||||
|
onClick={() => {
|
||||||
|
dropdownTippyRef.current.hide();
|
||||||
|
onModeChange('awsv4');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
AWS Sig v4
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
className="dropdown-item"
|
className="dropdown-item"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
const Wrapper = styled.div`
|
||||||
|
label {
|
||||||
|
font-size: 0.8125rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.single-line-editor-wrapper {
|
||||||
|
padding: 0.15rem 0.4rem;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: solid 1px ${(props) => props.theme.input.border};
|
||||||
|
background-color: ${(props) => props.theme.input.bg};
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default Wrapper;
|
@ -0,0 +1,192 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import get from 'lodash/get';
|
||||||
|
import { useTheme } from 'providers/Theme';
|
||||||
|
import { useDispatch } from 'react-redux';
|
||||||
|
import SingleLineEditor from 'components/SingleLineEditor';
|
||||||
|
import { updateCollectionAuth } from 'providers/ReduxStore/slices/collections';
|
||||||
|
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
|
||||||
|
import StyledWrapper from './StyledWrapper';
|
||||||
|
|
||||||
|
const AwsV4Auth = ({ collection }) => {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const { storedTheme } = useTheme();
|
||||||
|
|
||||||
|
const awsv4Auth = get(collection, 'root.request.auth.awsv4', {});
|
||||||
|
console.log('saved auth', awsv4Auth);
|
||||||
|
|
||||||
|
const handleSave = () => dispatch(saveCollectionRoot(collection.uid));
|
||||||
|
|
||||||
|
const handleAccessKeyIdChange = (accessKeyId) => {
|
||||||
|
dispatch(
|
||||||
|
updateCollectionAuth({
|
||||||
|
mode: 'awsv4',
|
||||||
|
collectionUid: collection.uid,
|
||||||
|
content: {
|
||||||
|
accessKeyId: accessKeyId,
|
||||||
|
secretAccessKey: awsv4Auth.secretAccessKey,
|
||||||
|
sessionToken: awsv4Auth.sessionToken,
|
||||||
|
service: awsv4Auth.service,
|
||||||
|
region: awsv4Auth.region,
|
||||||
|
profileName: awsv4Auth.profileName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSecretAccessKeyChange = (secretAccessKey) => {
|
||||||
|
dispatch(
|
||||||
|
updateCollectionAuth({
|
||||||
|
mode: 'awsv4',
|
||||||
|
collectionUid: collection.uid,
|
||||||
|
content: {
|
||||||
|
accessKeyId: awsv4Auth.accessKeyId,
|
||||||
|
secretAccessKey: secretAccessKey,
|
||||||
|
sessionToken: awsv4Auth.sessionToken,
|
||||||
|
service: awsv4Auth.service,
|
||||||
|
region: awsv4Auth.region,
|
||||||
|
profileName: awsv4Auth.profileName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSessionTokenChange = (sessionToken) => {
|
||||||
|
dispatch(
|
||||||
|
updateCollectionAuth({
|
||||||
|
mode: 'awsv4',
|
||||||
|
collectionUid: collection.uid,
|
||||||
|
content: {
|
||||||
|
accessKeyId: awsv4Auth.accessKeyId,
|
||||||
|
secretAccessKey: awsv4Auth.secretAccessKey,
|
||||||
|
sessionToken: sessionToken,
|
||||||
|
service: awsv4Auth.service,
|
||||||
|
region: awsv4Auth.region,
|
||||||
|
profileName: awsv4Auth.profileName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleServiceChange = (service) => {
|
||||||
|
dispatch(
|
||||||
|
updateCollectionAuth({
|
||||||
|
mode: 'awsv4',
|
||||||
|
collectionUid: collection.uid,
|
||||||
|
content: {
|
||||||
|
accessKeyId: awsv4Auth.accessKeyId,
|
||||||
|
secretAccessKey: awsv4Auth.secretAccessKey,
|
||||||
|
sessionToken: awsv4Auth.sessionToken,
|
||||||
|
service: service,
|
||||||
|
region: awsv4Auth.region,
|
||||||
|
profileName: awsv4Auth.profileName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleRegionChange = (region) => {
|
||||||
|
dispatch(
|
||||||
|
updateCollectionAuth({
|
||||||
|
mode: 'awsv4',
|
||||||
|
collectionUid: collection.uid,
|
||||||
|
content: {
|
||||||
|
accessKeyId: awsv4Auth.accessKeyId,
|
||||||
|
secretAccessKey: awsv4Auth.secretAccessKey,
|
||||||
|
sessionToken: awsv4Auth.sessionToken,
|
||||||
|
service: awsv4Auth.service,
|
||||||
|
region: region,
|
||||||
|
profileName: awsv4Auth.profileName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleProfileNameChange = (profileName) => {
|
||||||
|
dispatch(
|
||||||
|
updateCollectionAuth({
|
||||||
|
mode: 'awsv4',
|
||||||
|
collectionUid: collection.uid,
|
||||||
|
content: {
|
||||||
|
accessKeyId: awsv4Auth.accessKeyId,
|
||||||
|
secretAccessKey: awsv4Auth.secretAccessKey,
|
||||||
|
sessionToken: awsv4Auth.sessionToken,
|
||||||
|
service: awsv4Auth.service,
|
||||||
|
region: awsv4Auth.region,
|
||||||
|
profileName: profileName
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<StyledWrapper className="mt-2 w-full">
|
||||||
|
<label className="block font-medium mb-2">Access Key ID</label>
|
||||||
|
<div className="single-line-editor-wrapper mb-2">
|
||||||
|
<SingleLineEditor
|
||||||
|
value={awsv4Auth.accessKeyId || ''}
|
||||||
|
theme={storedTheme}
|
||||||
|
onSave={handleSave}
|
||||||
|
onChange={(val) => handleAccessKeyIdChange(val)}
|
||||||
|
collection={collection}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label className="block font-medium mb-2">Secret Access Key</label>
|
||||||
|
<div className="single-line-editor-wrapper mb-2">
|
||||||
|
<SingleLineEditor
|
||||||
|
value={awsv4Auth.secretAccessKey || ''}
|
||||||
|
theme={storedTheme}
|
||||||
|
onSave={handleSave}
|
||||||
|
onChange={(val) => handleSecretAccessKeyChange(val)}
|
||||||
|
collection={collection}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label className="block font-medium mb-2">Session Token</label>
|
||||||
|
<div className="single-line-editor-wrapper mb-2">
|
||||||
|
<SingleLineEditor
|
||||||
|
value={awsv4Auth.sessionToken || ''}
|
||||||
|
theme={storedTheme}
|
||||||
|
onSave={handleSave}
|
||||||
|
onChange={(val) => handleSessionTokenChange(val)}
|
||||||
|
collection={collection}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label className="block font-medium mb-2">Service</label>
|
||||||
|
<div className="single-line-editor-wrapper mb-2">
|
||||||
|
<SingleLineEditor
|
||||||
|
value={awsv4Auth.service || ''}
|
||||||
|
theme={storedTheme}
|
||||||
|
onSave={handleSave}
|
||||||
|
onChange={(val) => handleServiceChange(val)}
|
||||||
|
collection={collection}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label className="block font-medium mb-2">Region</label>
|
||||||
|
<div className="single-line-editor-wrapper mb-2">
|
||||||
|
<SingleLineEditor
|
||||||
|
value={awsv4Auth.region || ''}
|
||||||
|
theme={storedTheme}
|
||||||
|
onSave={handleSave}
|
||||||
|
onChange={(val) => handleRegionChange(val)}
|
||||||
|
collection={collection}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label className="block font-medium mb-2">Profile Name</label>
|
||||||
|
<div className="single-line-editor-wrapper mb-2">
|
||||||
|
<SingleLineEditor
|
||||||
|
value={awsv4Auth.profileName || ''}
|
||||||
|
theme={storedTheme}
|
||||||
|
onSave={handleSave}
|
||||||
|
onChange={(val) => handleProfileNameChange(val)}
|
||||||
|
collection={collection}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</StyledWrapper>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AwsV4Auth;
|
@ -2,6 +2,7 @@ import React from 'react';
|
|||||||
import get from 'lodash/get';
|
import get from 'lodash/get';
|
||||||
import { useDispatch } from 'react-redux';
|
import { useDispatch } from 'react-redux';
|
||||||
import AuthMode from './AuthMode';
|
import AuthMode from './AuthMode';
|
||||||
|
import AwsV4Auth from './AwsV4Auth';
|
||||||
import BearerAuth from './BearerAuth';
|
import BearerAuth from './BearerAuth';
|
||||||
import BasicAuth from './BasicAuth';
|
import BasicAuth from './BasicAuth';
|
||||||
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
|
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
|
||||||
@ -15,6 +16,9 @@ const Auth = ({ collection }) => {
|
|||||||
|
|
||||||
const getAuthView = () => {
|
const getAuthView = () => {
|
||||||
switch (authMode) {
|
switch (authMode) {
|
||||||
|
case 'awsv4': {
|
||||||
|
return <AwsV4Auth collection={collection} />;
|
||||||
|
}
|
||||||
case 'basic': {
|
case 'basic': {
|
||||||
return <BasicAuth collection={collection} />;
|
return <BasicAuth collection={collection} />;
|
||||||
}
|
}
|
||||||
|
@ -969,6 +969,10 @@ export const collectionsSlice = createSlice({
|
|||||||
|
|
||||||
if (collection) {
|
if (collection) {
|
||||||
switch (action.payload.mode) {
|
switch (action.payload.mode) {
|
||||||
|
case 'awsv4':
|
||||||
|
set(collection, 'root.request.auth.awsv4', action.payload.content);
|
||||||
|
console.log('set auth awsv4', action.payload.content);
|
||||||
|
break;
|
||||||
case 'bearer':
|
case 'bearer':
|
||||||
set(collection, 'root.request.auth.bearer', action.payload.content);
|
set(collection, 'root.request.auth.bearer', action.payload.content);
|
||||||
break;
|
break;
|
||||||
|
@ -8,15 +8,26 @@ const decomment = require('decomment');
|
|||||||
const setAuthHeaders = (axiosRequest, request, collectionRoot) => {
|
const setAuthHeaders = (axiosRequest, request, collectionRoot) => {
|
||||||
const collectionAuth = get(collectionRoot, 'request.auth');
|
const collectionAuth = get(collectionRoot, 'request.auth');
|
||||||
if (collectionAuth) {
|
if (collectionAuth) {
|
||||||
if (collectionAuth.mode === 'basic') {
|
switch (collectionAuth.mode) {
|
||||||
|
case 'awsv4':
|
||||||
|
axiosRequest.awsv4config = {
|
||||||
|
accessKeyId: get(collectionAuth, 'awsv4.accessKeyId'),
|
||||||
|
secretAccessKey: get(collectionAuth, 'awsv4.secretAccessKey'),
|
||||||
|
sessionToken: get(collectionAuth, 'awsv4.sessionToken'),
|
||||||
|
service: get(collectionAuth, 'awsv4.service'),
|
||||||
|
region: get(collectionAuth, 'awsv4.region'),
|
||||||
|
profileName: get(collectionAuth, 'awsv4.profileName')
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case 'basic':
|
||||||
axiosRequest.auth = {
|
axiosRequest.auth = {
|
||||||
username: get(collectionAuth, 'basic.username'),
|
username: get(collectionAuth, 'basic.username'),
|
||||||
password: get(collectionAuth, 'basic.password')
|
password: get(collectionAuth, 'basic.password')
|
||||||
};
|
};
|
||||||
}
|
break;
|
||||||
|
case 'bearer':
|
||||||
if (collectionAuth.mode === 'bearer') {
|
|
||||||
axiosRequest.headers['authorization'] = `Bearer ${get(collectionAuth, 'bearer.token')}`;
|
axiosRequest.headers['authorization'] = `Bearer ${get(collectionAuth, 'bearer.token')}`;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ const { outdentString } = require('../../v1/src/utils');
|
|||||||
|
|
||||||
const grammar = ohm.grammar(`Bru {
|
const grammar = ohm.grammar(`Bru {
|
||||||
BruFile = (meta | query | headers | auth | auths | vars | script | tests | docs)*
|
BruFile = (meta | query | headers | auth | auths | vars | script | tests | docs)*
|
||||||
auths = authbasic | authbearer
|
auths = authawsv4 | authbasic | authbearer
|
||||||
|
|
||||||
nl = "\\r"? "\\n"
|
nl = "\\r"? "\\n"
|
||||||
st = " " | "\\t"
|
st = " " | "\\t"
|
||||||
@ -38,6 +38,7 @@ const grammar = ohm.grammar(`Bru {
|
|||||||
varsreq = "vars:pre-request" dictionary
|
varsreq = "vars:pre-request" dictionary
|
||||||
varsres = "vars:post-response" dictionary
|
varsres = "vars:post-response" dictionary
|
||||||
|
|
||||||
|
authawsv4 = "auth:awsv4" dictionary
|
||||||
authbasic = "auth:basic" dictionary
|
authbasic = "auth:basic" dictionary
|
||||||
authbearer = "auth:bearer" dictionary
|
authbearer = "auth:bearer" dictionary
|
||||||
|
|
||||||
@ -171,6 +172,33 @@ const sem = grammar.createSemantics().addAttribute('ast', {
|
|||||||
headers: mapPairListToKeyValPairs(dictionary.ast)
|
headers: mapPairListToKeyValPairs(dictionary.ast)
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
authawsv4(_1, dictionary) {
|
||||||
|
const auth = mapPairListToKeyValPairs(dictionary.ast, false);
|
||||||
|
const accessKeyIdKey = _.find(auth, { name: 'accessKeyId' });
|
||||||
|
const secretAccessKeyKey = _.find(auth, { name: 'secretAccessKey' });
|
||||||
|
const sessionTokenKey = _.find(auth, { name: 'sessionToken' });
|
||||||
|
const serviceKey = _.find(auth, { name: 'service' });
|
||||||
|
const regionKey = _.find(auth, { name: 'region' });
|
||||||
|
const profileNameKey = _.find(auth, { name: 'profileName' });
|
||||||
|
const accessKeyId = accessKeyIdKey ? accessKeyIdKey.value : '';
|
||||||
|
const secretAccessKey = secretAccessKeyKey ? secretAccessKeyKey.value : '';
|
||||||
|
const sessionToken = sessionTokenKey ? sessionTokenKey.value : '';
|
||||||
|
const service = serviceKey ? serviceKey.value : '';
|
||||||
|
const region = regionKey ? regionKey.value : '';
|
||||||
|
const profileName = profileNameKey ? profileNameKey.value : '';
|
||||||
|
return {
|
||||||
|
auth: {
|
||||||
|
awsv4: {
|
||||||
|
accessKeyId,
|
||||||
|
secretAccessKey,
|
||||||
|
sessionToken,
|
||||||
|
service,
|
||||||
|
region,
|
||||||
|
profileName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
authbasic(_1, dictionary) {
|
authbasic(_1, dictionary) {
|
||||||
const auth = mapPairListToKeyValPairs(dictionary.ast, false);
|
const auth = mapPairListToKeyValPairs(dictionary.ast, false);
|
||||||
const usernameKey = _.find(auth, { name: 'username' });
|
const usernameKey = _.find(auth, { name: 'username' });
|
||||||
|
@ -72,6 +72,19 @@ const jsonToCollectionBru = (json) => {
|
|||||||
${indentString(`mode: ${auth.mode}`)}
|
${indentString(`mode: ${auth.mode}`)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auth && auth.awsv4) {
|
||||||
|
bru += `auth:awsv4 {
|
||||||
|
${indentString(`accessKeyId: ${auth.awsv4.accessKeyId}`)}
|
||||||
|
${indentString(`secretAccessKey: ${auth.awsv4.secretAccessKey}`)}
|
||||||
|
${indentString(`sessionToken: ${auth.awsv4.sessionToken}`)}
|
||||||
|
${indentString(`service: ${auth.awsv4.service}`)}
|
||||||
|
${indentString(`region: ${auth.awsv4.region}`)}
|
||||||
|
${indentString(`profileName: ${auth.awsv4.profileName}`)}
|
||||||
|
}
|
||||||
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user