Currently, I have developed a basic backend API that requires multiple authentications. My current challenge is connecting to the Twitter API using Bell. However, instead of displaying the authentication page for the app, an error is being shown: {"statusCode":500,"error":"Internal Server Error","message":"An internal server error occurred"}
Below are the dependency files:
index.ts
'use strict';
import * as hapi from "hapi";
import * as boom from "boom";
import router from './router/router';
const server: hapi.Server = new hapi.Server();
server.connection({ port: 3000, host: 'localhost' });
// .register(...) registers a module within the instance of the API. The callback is then used to tell that the loaded module will be used as an authentication strategy.
server.register( [require( 'hapi-auth-jwt' ), require('hapi-auth-cookie'), require('bell')], ( err ) => {
// normal server auth strategy using JWT
server.auth.strategy( 'token', 'jwt', {
key: 'secretkey',
verifyOptions: {
algorithms: [ 'HS256' ],
},
redirectTo: '/login'
} );
//Setup the session strategy
server.auth.strategy('session', 'cookie', {
password: 'secret_cookie_encryption_password', //Use something more secure in production
redirectTo: '/login', //If there is no session, redirect here
isSecure: false //Should be set to true (which is the default) in production
});
//Setup the social Twitter login strategy
server.auth.strategy('twitter', 'bell', {
provider: 'twitter',
password: 'secret_cookie_encryption_password', //Use something more secure in production
clientId: 'secretkey',
clientSecret: ' secretkey',
isSecure: false //Should be set to true (which is the default) in production
});
//server.auth.default('token');
// Make sure server get auth first before attach the router
router.forEach( ( router ) => {
console.log( `attaching ${ router.path }` );
server.route( router );
} );
} );
server.start((err) => {
if (err) {
throw err;
}
console.log(`Server running at: ${server.info.uri}`);
});
router.ts
'use strict';
import controllers from '../server/controllers/Index';
import models from '../server/models/index';
import { compareHashPassword } from '../Helper';
import * as jwt from "jsonwebtoken";
import * as Boom from "boom";
// Init express router saja
let router;
let User = models.User;
// Setting API URL
router = [
{
method: 'GET',
path: '/',
config: {
auth: {
strategies: ['token', 'session'],
}, //<-- require a session for this, so we have access to the twitter profile
handler: function(request, reply) {
//Return a message using the information from the session
return reply('Hello, ' + request.auth.credentials.displayName + '!');
}
}
},
{
method: 'GET',
path: '/login',
handler: function(request, reply) {
return reply('Please Login to ReviewUr!');
}
},
// Authentication route for Token
{
path: '/auth',
method: 'POST',
handler: controllers.Auths.list
},
// Authentication route for Twitter
{
method: 'GET',
path: '/auth/twitter',
config: {
auth: 'twitter',
handler: function(request, reply) {
if (!request.auth.isAuthenticated) {
//return reply(Boom.unauthorized('Authentication failed: ' + request.auth.error.message));
return reply('unauthorized!');
}
const profile = request.auth.credentials.profile;
request.cookieAuth.set({
twitterId: profile.id,
username: profile.username,
displayName: profile.displayName
});
return reply.redirect('/').catch(error => reply(error));
}
}
},
///////////////////////////////////////
];
export default router
Do you think there might be something important that I'm overlooking? Let me know your thoughts.