mirror of
https://github.com/embarklabs/embark.git
synced 2025-01-09 13:26:10 +00:00
Merge pull request #133 from status-im/bug_fix/double-auth
Don't authenticate twice
This commit is contained in:
commit
b02cafe672
@ -5,5 +5,5 @@ export const LIGHT_THEME = 'light';
|
|||||||
export const DEPLOYMENT_PIPELINES = {
|
export const DEPLOYMENT_PIPELINES = {
|
||||||
injectedWeb3: 'injectedWeb3',
|
injectedWeb3: 'injectedWeb3',
|
||||||
embark: 'embark'
|
embark: 'embark'
|
||||||
}
|
};
|
||||||
export const DEFAULT_HOST = 'localhost:8000';
|
export const DEFAULT_HOST = process.env.NODE_ENV === 'development' ? 'localhost:8000' : window.location.host;
|
||||||
|
@ -5,7 +5,8 @@ import {withRouter} from "react-router-dom";
|
|||||||
import routes from '../routes';
|
import routes from '../routes';
|
||||||
import Login from '../components/Login';
|
import Login from '../components/Login';
|
||||||
import Layout from "../components/Layout";
|
import Layout from "../components/Layout";
|
||||||
import { DEFAULT_HOST } from '../constants';
|
import {DEFAULT_HOST} from '../constants';
|
||||||
|
import {getQueryToken, stripQueryToken} from '../utils/utils';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
authenticate, fetchCredentials, logout,
|
authenticate, fetchCredentials, logout,
|
||||||
@ -18,42 +19,57 @@ import {
|
|||||||
|
|
||||||
import {LIGHT_THEME, DARK_THEME} from '../constants';
|
import {LIGHT_THEME, DARK_THEME} from '../constants';
|
||||||
|
|
||||||
import { getCredentials, getAuthenticationError, getProcesses, getTheme } from '../reducers/selectors';
|
import {
|
||||||
|
getCredentials, getAuthenticationError, getProcesses, getTheme
|
||||||
const qs = require('qs');
|
} from '../reducers/selectors';
|
||||||
|
|
||||||
class AppContainer extends Component {
|
class AppContainer extends Component {
|
||||||
constructor (props) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
this.queryStringAuthenticate();
|
|
||||||
}
|
|
||||||
|
|
||||||
queryStringAuthenticate() {
|
|
||||||
const token = qs.parse(this.props.location.search, {ignoreQueryPrefix: true}).token;
|
|
||||||
|
|
||||||
if (!token) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const host = process.env.NODE_ENV === 'development' ? DEFAULT_HOST : window.location.host;
|
|
||||||
if (token === this.props.credentials.token && this.props.credentials.host === host) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.props.authenticate(host, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.fetchCredentials();
|
this.props.fetchCredentials();
|
||||||
this.props.fetchTheme();
|
this.props.fetchTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doAuthenticate() {
|
||||||
|
let {host, token} = this.props.credentials;
|
||||||
|
const queryToken = getQueryToken(this.props.location);
|
||||||
|
|
||||||
|
if (queryToken) {
|
||||||
|
host = DEFAULT_HOST;
|
||||||
|
token = queryToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.props.authenticate(host, token);
|
||||||
|
}
|
||||||
|
|
||||||
requireAuthentication() {
|
requireAuthentication() {
|
||||||
return this.props.credentials.token && this.props.credentials.host && !this.props.credentials.authenticated;
|
if (this.props.credentials.authenticating) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const queryToken = getQueryToken(this.props.location);
|
||||||
|
if (queryToken && !(queryToken === this.props.credentials.token &&
|
||||||
|
this.props.credentials.host === DEFAULT_HOST)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.props.credentials.authenticated &&
|
||||||
|
this.props.credentials.host &&
|
||||||
|
this.props.credentials.token) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(){
|
componentDidUpdate(){
|
||||||
if (this.requireAuthentication()) {
|
if (this.requireAuthentication()) {
|
||||||
this.props.authenticate(this.props.credentials.host, this.props.credentials.token);
|
this.doAuthenticate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getQueryToken(this.props.location) &&
|
||||||
|
(!this.props.credentials.authenticating ||
|
||||||
|
this.props.credentials.authenticated)) {
|
||||||
|
this.props.history.replace(stripQueryToken(this.props.location));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.props.credentials.authenticated && !this.props.initialized) {
|
if (this.props.credentials.authenticated && !this.props.initialized) {
|
||||||
@ -64,7 +80,8 @@ class AppContainer extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
shouldRenderLogin() {
|
shouldRenderLogin() {
|
||||||
return this.props.authenticationError || !this.props.credentials.authenticated;
|
return this.props.authenticationError ||
|
||||||
|
!(this.props.credentials.authenticated || this.props.credentials.authenticating);
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleTheme() {
|
toggleTheme() {
|
||||||
@ -77,12 +94,18 @@ class AppContainer extends Component {
|
|||||||
|
|
||||||
renderBody() {
|
renderBody() {
|
||||||
if (this.shouldRenderLogin()) {
|
if (this.shouldRenderLogin()) {
|
||||||
return <Login credentials={this.props.credentials} authenticate={this.props.authenticate} error={this.props.authenticationError} />;
|
return (
|
||||||
|
<Login credentials={this.props.credentials}
|
||||||
|
authenticate={this.props.authenticate}
|
||||||
|
error={this.props.authenticationError} />
|
||||||
|
);
|
||||||
|
} else if (this.props.credentials.authenticating) {
|
||||||
|
return <React.Fragment/>;
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<Layout location={this.props.location}
|
<Layout location={this.props.location}
|
||||||
logout={this.props.logout}
|
logout={this.props.logout}
|
||||||
toggleTheme={() => this.toggleTheme()}
|
toggleTheme={() => this.toggleTheme()}
|
||||||
currentTheme={this.props.theme}>
|
currentTheme={this.props.theme}>
|
||||||
<React.Fragment>{routes}</React.Fragment>
|
<React.Fragment>{routes}</React.Fragment>
|
||||||
</Layout>
|
</Layout>
|
||||||
@ -90,7 +113,11 @@ class AppContainer extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return <div className={(this.props.theme) + "-theme"}>{this.renderBody()}</div>;
|
return (
|
||||||
|
<div className={(this.props.theme) + "-theme"}>
|
||||||
|
{this.renderBody()}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,7 +200,13 @@ function compilingContract(state = false, action) {
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
const DEFAULT_CREDENTIALS_STATE = {host: DEFAULT_HOST, token: '', authenticated: false};
|
const DEFAULT_CREDENTIALS_STATE = {
|
||||||
|
host: DEFAULT_HOST,
|
||||||
|
token: '',
|
||||||
|
authenticated: false,
|
||||||
|
authenticating: false,
|
||||||
|
error: null
|
||||||
|
};
|
||||||
|
|
||||||
function credentials(state = DEFAULT_CREDENTIALS_STATE, action) {
|
function credentials(state = DEFAULT_CREDENTIALS_STATE, action) {
|
||||||
if (action.type === LOGOUT[SUCCESS]) {
|
if (action.type === LOGOUT[SUCCESS]) {
|
||||||
@ -208,17 +214,21 @@ function credentials(state = DEFAULT_CREDENTIALS_STATE, action) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (action.type === AUTHENTICATE[FAILURE]) {
|
if (action.type === AUTHENTICATE[FAILURE]) {
|
||||||
return {error: action.error, authenticated: false};
|
return {error: action.error, ...DEFAULT_CREDENTIALS_STATE};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action.type === AUTHENTICATE[SUCCESS]) {
|
if (action.type === AUTHENTICATE[SUCCESS]) {
|
||||||
return {...state, ...{authenticated: true, token: action.token, host: action.host, error: null}};
|
return {...state, ...{authenticated: true, authenticating: false, token: action.token, host: action.host, error: null}};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action.type === FETCH_CREDENTIALS[SUCCESS]) {
|
if (action.type === FETCH_CREDENTIALS[SUCCESS]) {
|
||||||
return {...state, ...{token: action.token, host: action.host}};
|
return {...state, ...{token: action.token, host: action.host}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (action.type === AUTHENTICATE[REQUEST]) {
|
||||||
|
return {...state, ...{authenticating: true, error: null}};
|
||||||
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,6 +273,10 @@ export function *watchAuthenticateSuccess() {
|
|||||||
yield takeEvery(actions.AUTHENTICATE[actions.SUCCESS], saveCredentials);
|
yield takeEvery(actions.AUTHENTICATE[actions.SUCCESS], saveCredentials);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function *watchAuthenticateFailure() {
|
||||||
|
yield takeEvery(actions.AUTHENTICATE[actions.FAILURE], logout);
|
||||||
|
}
|
||||||
|
|
||||||
export function *watchFetchCredentials() {
|
export function *watchFetchCredentials() {
|
||||||
yield takeEvery(actions.FETCH_CREDENTIALS[actions.REQUEST], fetchCredentials);
|
yield takeEvery(actions.FETCH_CREDENTIALS[actions.REQUEST], fetchCredentials);
|
||||||
}
|
}
|
||||||
@ -518,6 +522,7 @@ export default function *root() {
|
|||||||
fork(watchToggleBreakpoint),
|
fork(watchToggleBreakpoint),
|
||||||
fork(watchAuthenticate),
|
fork(watchAuthenticate),
|
||||||
fork(watchAuthenticateSuccess),
|
fork(watchAuthenticateSuccess),
|
||||||
|
fork(watchAuthenticateFailure),
|
||||||
fork(watchLogout),
|
fork(watchLogout),
|
||||||
fork(watchExplorerSearch),
|
fork(watchExplorerSearch),
|
||||||
fork(watchFetchTheme),
|
fork(watchFetchTheme),
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
const Convert = require('ansi-to-html');
|
import Convert from 'ansi-to-html';
|
||||||
|
import qs from 'qs';
|
||||||
|
|
||||||
export function last(array) {
|
export function last(array) {
|
||||||
return array && array.length ? array[array.length - 1] : undefined;
|
return array && array.length ? array[array.length - 1] : undefined;
|
||||||
@ -17,5 +18,18 @@ export function hashCode(str) {
|
|||||||
|
|
||||||
export function ansiToHtml(text) {
|
export function ansiToHtml(text) {
|
||||||
const convert = new Convert();
|
const convert = new Convert();
|
||||||
return convert.toHtml(text.replace(/\n/g,'<br>'))
|
return convert.toHtml(text.replace(/\n/g,'<br>'));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getQueryToken(location) {
|
||||||
|
return qs.parse(location.search, {ignoreQueryPrefix: true}).token;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function stripQueryToken(location) {
|
||||||
|
const _location = Object.assign({}, location);
|
||||||
|
_location.search = _location.search.replace(
|
||||||
|
/(\?|&?)(token=[\w-]*)(&?)/,
|
||||||
|
(_, p1, p2, p3) => (p2 ? (p3 === '&' ? p1 : '') : '')
|
||||||
|
);
|
||||||
|
return _location;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user