I'm trying to do simple authentication using Auth0 in a react app served through express.
If I run npm start my React App will work fine with Auth0.
If I run node server.js and have my express server running the local server everything works fine on my page until the Auth0 callback.
I tried disabling the RedirectURI option on Auth0 per one of the other Stackoverflow posts but my app is still looking for localhost:3000/callback. I don't know where this is coming from as I've taken all the callback references out of my code.
Here's my Auth.js
import { EventEmitter } from 'events';
import auth0 from 'auth0-js';
import { AUTH_CONFIG } from './auth0-variables';
import history from '../history';
export default class Auth extends EventEmitter {
auth0 = new auth0.WebAuth({
domain: AUTH_CONFIG.domain,
clientID: AUTH_CONFIG.clientId,
audience: `https://${AUTH_CONFIG.domain}/userinfo`,
responseType: 'token id_token',
scope: 'openid profile'
});
userProfile;
constructor() {
super();
this.login = this.login.bind(this);
this.logout = this.logout.bind(this);
this.handleAuthentication = this.handleAuthentication.bind(this);
this.isAuthenticated = this.isAuthenticated.bind(this);
this.getAccessToken = this.getAccessToken.bind(this);
this.getProfile = this.getProfile.bind(this);
}
login() {
this.auth0.authorize({
});
}
handleAuthentication() {
this.auth0.parseHash((err, authResult) => {
console.log(err)
console.log(authResult)
if (authResult && authResult.accessToken && authResult.idToken) {
this.setSession(authResult);
history.replace('/home');
} else if (err) {
history.replace('/home');
console.log(err);
alert(`Error: ${err.error}. Check the console for further details.`);
}
});
}
setSession(authResult) {
if (authResult && authResult.accessToken && authResult.idToken) {
// Set the time that the access token will expire at
let expiresAt = JSON.stringify(
authResult.expiresIn * 1000 + new Date().getTime()
);
localStorage.setItem('access_token', authResult.accessToken);
localStorage.setItem('id_token', authResult.idToken);
localStorage.setItem('expires_at', expiresAt);
// navigate to the home route
history.replace('/home');
}
}
getAccessToken() {
const accessToken = localStorage.getItem('access_token');
if (!accessToken) {
throw new Error('No access token found');
}
return accessToken;
}
getProfile(cb) {
let accessToken = this.getAccessToken();
this.auth0.client.userInfo(accessToken, (err, profile) => {
if (profile) {
this.userProfile = profile;
}
cb(err, profile);
});
}
logout() {
// Clear access token and ID token from local storage
localStorage.removeItem('access_token');
localStorage.removeItem('id_token');
localStorage.removeItem('expires_at');
this.userProfile = null;
// navigate to the home route
history.replace('/home');
}
isAuthenticated() {
// Check whether the current time is past the
// access token's expiry time
let expiresAt = JSON.parse(localStorage.getItem('expires_at'));
return new Date().getTime() < expiresAt;
}
}
And here are my routes in React
import React from 'react';
import { Redirect, Route, BrowserRouter } from 'react-router-dom';
import App from './App';
import Home from './Home/Home';
import Profile from './Profile/Profile';
import Callback from './Callback/Callback';
import Auth from './Auth/Auth';
import history from './history';
const auth = new Auth();
const handleAuthentication = (nextState, replace) => {
if (/access_token|id_token|error/.test(nextState.location.hash)) {
auth.handleAuthentication(nextState.location.hash);
}
}
export const makeMainRoutes = () => {
return (
<BrowserRouter history={history} component={App}>
<div>
<Route path="/" render={(props) => <App auth={auth} {...props} />} />
<Route path="/home" render={(props) => <Home auth={auth} {...props} />} />
<Route path="/profile" render={(props) => (
!auth.isAuthenticated() ? (
<Redirect to="/home"/>
) : (
<Profile auth={auth} {...props} />
)
)} />
<Route path="/callback" render={(props) => {
handleAuthentication(props);
return <Callback {...props} />
}}/>
</div>
</BrowserRouter>
);
}
My express server serves up the build directory and then has some api endpoints for mongodb and glassdoor api
var app = express();
app.use(bodyParser.json());
app.use(express.static('build'));
var mongoDB = 'mongodb://127.0.0.1/my_database';
Mongoose.connect(mongoDB);
var db = Mongoose.connection;
var server = app.listen(process.env.PORT || 3000, function (){
var port = server.address().port;
console.log("app now running on port", port);
});
Any help is much appreciated.
via David Quisenberry
No comments:
Post a Comment