2017-10-14 1 views
0

Ich habe einige grundlegende Backend-API erstellen erfordern mehrere Authentifizierung. Jetzt versuche ich eine Verbindung mit Twitter API mit Bell herzustellen, aber das Problem ist, anstatt die Seite anzuzeigen, damit ich die App authentifizieren kann. Show error {"statusCode": 500, "error": "Interner Server Error", " message ":" Ein interner Serverfehler aufgetreten "}Hapi mit Bell konnte nicht auf Twitter authentifizieren

Im Folgenden finden Sie die Abhängigkeitsdateien:

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 

Gibt es etwas, das mir fehlt?

Antwort

0

Haben Sie versucht, die Route '/ auth/twitter' nach '/ auth' zu verschieben, scheint es sich um '/ auth' vor '/ auth/twitter' zu handeln. In welcher Route versuchen Sie, die Benutzeranmeldungsoptionen anzuzeigen? /Anmeldung ?

Haben Sie ohne jwt oder auth-cookie versucht, nur mit twitter? Vielleicht stimmt etwas mit anderen Plugins nicht.

Dies ist meine Implementierung, die ich aus einer Live-App extrahiert habe.

app-auth.js

const Boom = require('boom'); 
const internals = {}; 
const config = require('config'); 

exports.register = function (server, options, next) { 
    server.auth.scheme('basic', internals.implementation); 
    server.auth.strategy('simple', 'basic', true); 

    // handle twitter login errors here 
    server.ext('onPreResponse', function (request, reply) { 
     const req = request.response; 
     if (req.isBoom && request.path === 'login') { 
      // there has been an error occurred during login process, sent user to home page 
      server.log(['error', 'auth', 'twitter'], req.output.payload.error); 
      return reply.redirect('/?error=103&account_error=' + encodeURIComponent(req.output.payload.error)); 
     } 

     return reply.continue(); 
    }); 

    // twitter application registration 
    server.auth.strategy('twitter', 'bell', { 
     provider: 'twitter', 
     password: config.get('twitter.pass'), 
     clientId: config.get('twitter.key'), 
     clientSecret: config.get('twitter.secret'), 
     isSecure: config.get('authSecurity') 
    }); 

    return next(); 
}; 

internals.implementation = function (server, options) { 

    return { 
     authenticate: function (request, reply) { 
      // if there is no session information 
      if (!request.yar.get('auth')) { 
       const headers = request.headers; 
       // if this request is xmlhttp then return as json 
       if (headers['x-requested-with'] === 'XMLHttpRequest') { 
        return reply(Boom.unauthorized("Please sign-in to system.")); 
       } 
       return reply.redirect('/login'); 
      } 
      return reply.continue({credentials: request.yar.get('auth')}); 
     } 
    } 
}; 

exports.register.attributes = { 
    name: 'app_auth',  
    version: require('../package.json').version 
}; 

twitter-route.js

exports.view = { 
    description: 'Twitter authentication handler', 
    auth: 'twitter', 
    handler: async (request, reply) => { 
     // something went wrong 
     if (!request.auth.isAuthenticated) { 
      request.yar.flash('ERROR', request.auth.error.message); 
      return reply.redirect('/login_error?error=103&account_error=' + encodeURIComponent(request.auth.error.message)); 
     } 

     // profile information coming from twitter 
     const profile = request.auth.credentials.profile; 

     // do what ever you want with profile 

    } 
}; 
Verwandte Themen