nodejs客户端无法注册到基于nodejs护照的身份验证服务

时间:2019-03-20 10:58:00

标签: node.js express axios passport.js

我正在尝试实现基于nodejs express passport axios的服务器-客户端通信。我的目标是使用终端将文件推送到服务器。但是首先,我尝试实现身份验证服务。我有passport auth服务,当我签名投掷邮递员应用程序时效果很好。

enter image description here

此外,我已经实现了基于nodejs的客户端,该客户端尝试注册到服务器但没有成功。

错误:

   { Error: Request failed with status code 400
    at createError (/home/gefalko/gepick-devenv/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/home/gefalko/gepick-devenv/node_modules/axios/lib/core/settle.js:18:12)
    at IncomingMessage.handleStreamEnd (/home/gefalko/gepick-devenv/node_modules/axios/lib/adapters/http.js:201:11)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickCallback (internal/process/next_tick.js:181:9)
  config: 
   { adapter: [Function: httpAdapter],
     transformRequest: { '0': [Function: transformRequest] },
     transformResponse: { '0': [Function: transformResponse] },
     timeout: 0,
     xsrfCookieName: 'XSRF-TOKEN',
     xsrfHeaderName: 'X-XSRF-TOKEN',
     maxContentLength: -1,
     validateStatus: [Function: validateStatus],
     headers: 
      { Accept: 'application/json, text/plain, */*',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'User-Agent': 'axios/0.18.0',
        'Content-Length': 45 },
     method: 'post',
     url: 'http://localhost:3005/login',
     data: '{"username":"gefalko","password":"mypass"}' },
  request: 
   ClientRequest {
     domain: null,
     _events: 
      { socket: [Function],
        abort: [Function],
        aborted: [Function],
        error: [Function],
        timeout: [Function],
        prefinish: [Function: requestOnPrefinish] },
     _eventsCount: 6,
     _maxListeners: undefined,
     output: [],
     outputEncodings: [],
     outputCallbacks: [],
     outputSize: 0,
     writable: true,
     _last: true,
     upgrading: false,
     chunkedEncoding: false,
     shouldKeepAlive: false,
     useChunkedEncodingByDefault: true,
     sendDate: false,
     _removedConnection: false,
     _removedContLen: false,
     _removedTE: false,
     _contentLength: null,
     _hasBody: true,
     _trailer: '',
     finished: true,
     _headerSent: true,
     socket: 
      Socket {
        connecting: false,
        _hadError: false,
        _handle: [Object],
        _parent: null,
        _host: 'localhost',
        _readableState: [Object],
        readable: true,
        domain: null,
        _events: [Object],
        _eventsCount: 8,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: false,
        allowHalfOpen: false,
        _bytesDispatched: 263,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: null,
        _server: null,
        parser: null,
        _httpMessage: [Circular],
        [Symbol(asyncId)]: 45,
        [Symbol(bytesRead)]: 0 },
     connection: 
      Socket {
        connecting: false,
        _hadError: false,
        _handle: [Object],
        _parent: null,
        _host: 'localhost',
        _readableState: [Object],
        readable: true,
        domain: null,
        _events: [Object],
        _eventsCount: 8,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: false,
        allowHalfOpen: false,
        _bytesDispatched: 263,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: null,
        _server: null,
        parser: null,
        _httpMessage: [Circular],
        [Symbol(asyncId)]: 45,
        [Symbol(bytesRead)]: 0 },
     _header: 'POST /login HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\r\nUser-Agent: axios/0.18.0\r\nContent-Length: 45\r\nHost: localhost:3005\r\nConnection: close\r\n\r\n',
     _onPendingData: [Function: noopPendingOutput],
     agent: 
      Agent {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 80,
        protocol: 'http:',
        options: [Object],
        requests: {},
        sockets: [Object],
        freeSockets: {},
        keepAliveMsecs: 1000,
        keepAlive: false,
        maxSockets: Infinity,
        maxFreeSockets: 256 },
     socketPath: undefined,
     timeout: undefined,
     method: 'POST',
     path: '/login',
     _ended: true,
     res: 
      IncomingMessage {
        _readableState: [Object],
        readable: false,
        domain: null,
        _events: [Object],
        _eventsCount: 3,
        _maxListeners: undefined,
        socket: [Object],
        connection: [Object],
        httpVersionMajor: 1,
        httpVersionMinor: 1,
        httpVersion: '1.1',
        complete: true,
        headers: [Object],
        rawHeaders: [Array],
        trailers: {},
        rawTrailers: [],
        aborted: false,
        upgrade: false,
        url: '',
        method: null,
        statusCode: 400,
        statusMessage: 'Bad Request',
        client: [Object],
        _consuming: true,
        _dumped: false,
        req: [Circular],
        responseUrl: 'http://localhost:3005/login',
        redirects: [],
        read: [Function] },
     aborted: undefined,
     timeoutCb: null,
     upgradeOrConnect: false,
     parser: null,
     maxHeadersCount: null,
     _redirectable: 
      Writable {
        _writableState: [Object],
        writable: true,
        domain: null,
        _events: [Object],
        _eventsCount: 2,
        _maxListeners: undefined,
        _options: [Object],
        _ended: true,
        _ending: true,
        _redirectCount: 0,
        _redirects: [],
        _requestBodyLength: 45,
        _requestBodyBuffers: [],
        _onNativeResponse: [Function],
        _currentRequest: [Circular],
        _currentUrl: 'http://localhost:3005/login' },
     [Symbol(outHeadersKey)]: 
      { accept: [Array],
        'content-type': [Array],
        'user-agent': [Array],
        'content-length': [Array],
        host: [Array] } },
  response: 
   { status: 400,
     statusText: 'Bad Request',
     headers: 
      { 'x-powered-by': 'Express',
        date: 'Wed, 20 Mar 2019 11:52:49 GMT',
        connection: 'close',
        'content-length': '11' },
     config: 
      { adapter: [Function: httpAdapter],
        transformRequest: [Object],
        transformResponse: [Object],
        timeout: 0,
        xsrfCookieName: 'XSRF-TOKEN',
        xsrfHeaderName: 'X-XSRF-TOKEN',
        maxContentLength: -1,
        validateStatus: [Function: validateStatus],
        headers: [Object],
        method: 'post',
        url: 'http://localhost:3005/login',
        data: '{"username":"gefalko","password":"mypass"}' },
     request: 
      ClientRequest {
        domain: null,
        _events: [Object],
        _eventsCount: 6,
        _maxListeners: undefined,
        output: [],
        outputEncodings: [],
        outputCallbacks: [],
        outputSize: 0,
        writable: true,
        _last: true,
        upgrading: false,
        chunkedEncoding: false,
        shouldKeepAlive: false,
        useChunkedEncodingByDefault: true,
        sendDate: false,
        _removedConnection: false,
        _removedContLen: false,
        _removedTE: false,
        _contentLength: null,
        _hasBody: true,
        _trailer: '',
        finished: true,
        _headerSent: true,
        socket: [Object],
        connection: [Object],
        _header: 'POST /login HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\r\nUser-Agent: axios/0.18.0\r\nContent-Length: 45\r\nHost: localhost:3005\r\nConnection: close\r\n\r\n',
        _onPendingData: [Function: noopPendingOutput],
        agent: [Object],
        socketPath: undefined,
        timeout: undefined,
        method: 'POST',
        path: '/login',
        _ended: true,
        res: [Object],
        aborted: undefined,
        timeoutCb: null,
        upgradeOrConnect: false,
        parser: null,
        maxHeadersCount: null,
        _redirectable: [Object],
        [Symbol(outHeadersKey)]: [Object] },
     data: 'Bad Request' } }

我的客户:

const axios = require('axios')                                                                                          
const prompt = require('prompt')                                                                                        

var prompt_attributes = [                                                                                               
    {                                                                                                                   
        name: 'username',                                                                                               
        validator: /^[a-zA-Z\s\-]+$/,                                                                                   
        warning: 'Username is not valid, it can only contains letters, spaces, or dashes'                               
    },                                                                                                                  
    {                                                                                                                   
        name: 'password',                                                                                               
        hidden: true                                                                                                    
    }                                                                                                                   
]                                                                                                                       

prompt.start();                                                                                                         

prompt.get(prompt_attributes, function (err, result) {                                                                  
    if (err) {                                                                                                          
        console.log(err);                                                                                               
        return 1;                                                                                                       
    }else {                                                                                                             
        console.log('Command-line received data:');                                                                     
        const username = result.username                                                                                
        const password = result.password                                                                                

        const config = {                                                                                                
          headers: {                                                                                                    
            'Content-Type': 'application/x-www-form-urlencoded'                                                         
          }                                                                                                             
        }                                                                                                               

        const reqBody =  {                                                                                              
          username: username,                                                                                           
          password: password                                                                                            
        }                                                                                                                  

        axios.post('http://localhost:3005/login', reqBody, config).then(response => {                                      
          console.log(response.data);                                                                                      
        }).catch(error => {                                                                                                
          console.log(error);                                                                                              
        })                                                                                                                 
    }                                                                                                                      
});

也尝试了'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',但没有帮助。

服务器:

import  * as express from 'express'

const  app = express()
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcryptjs')

app.use(require('cookie-parser')())
app.use(require('body-parser').urlencoded({ extended: true }))

app.use(passport.initialize())
const port = 3005

/* DATABASE */

import { MongoClient, ObjectID } from 'mongodb'

const  mongoUrl = "mongodb://localhost:27017/";

/* AUTHENTICATION */


MongoClient.connect(mongoUrl, async (err, db) => {
  const myDB = db.db('mydb')
  const Users = myDb.collection('users')


  passport.serializeUser(function(user, done) {
    done(null, user);
  });

  passport.deserializeUser(function(user, done) {
    done(null, user);
  });


  passport.use(new LocalStrategy(
   function(username, password, done) {
      Users.findOne({ username: username }, async function(err, user) {

        console.log('USER FROM DB:', user)
        console.log('PASS from client', password) 
        if (err) { return done(err); }

        if (!user){
          return done(null, false, { message: 'Incorrect username.' });
        }

         const res = await bcrypt.compare(password, user.password)


          return res ? done(null, user) : done(null, false, { message: 'Incorrect username.' })
      })
  }))

  app.post('/login',passport.authenticate('local'), (req, res) =>
    { 

        res.send('logined as ' + req.user.username)
     }
  )

  app.listen(port, () => console.log('http server listening on port '+port+'!'))

})

此外,我发现我的请求正文来自节点客户端时在服务器上被解析为奇怪,而当它来自邮递员时则被正确解析。

nodejs axios客户端的请求正文:

{ '{"username":"gefalko","password":"mypass"}': '' }

邮递员客户的请求正文:

{"username":"gefalko","password":"mypass"}

1 个答案:

答案 0 :(得分:0)

尝试这种格式:

var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 } , config);