2017-06-12 18 views
0

私のエラーのためのスタックを作成しようと考えました。私はいくつかの問題を認証を発していたが、それは私の作業プロジェクトのためのもので、別のバージョンです。私はまた、別のサービスと列の命名規則に問題があり、それからデフォルトがありました。それから、私が解決した 'FETCH' 'NEXT'でsequelizeとmssqlのために失敗しました。feathersjs - >エラー401とNotAuthenticatedのエラー401

環境

私は、Linuxシステム上で開発しています。使用されているデータベースは現在SQL2016上にあります。すべての選択は問題ありません。認証を有効にする前に挿入/更新しています。テーブルに物事を挿入/更新しました。

私は戦略にローカルに設定されているクライアント上で認証を開始し、サーバーとクライアント

Server 
    "feathers": "^2.1.1", 
    "feathers-authentication": "^1.2.1", 
    "feathers-authentication-jwt": "^0.3.1", 
    "feathers-authentication-local": "^0.3.4", 
    "feathers-configuration": "^0.3.3", 
    "feathers-errors": "^2.6.2", 
    "feathers-hooks": "^1.8.1", 
    "feathers-rest": "^1.7.1", 
    "feathers-sequelize": "^1.4.5", 
    "feathers-socketio": "^1.5.2", 

Client 
    "feathers": "^2.1.2", 
    "feathers-authentication": "^1.2.4", 
    "feathers-authentication-client": "^0.3.2", 
    "feathers-client": "^2.2.0", 
    "feathers-localstorage": "^1.0.0", 
    "feathers-socketio": "^2.0.0", 

問題のバージョンは、私が「認証され得ることを期待しながら、怒鳴る次のエラーを取得します'ユーザーとパスワードは正しいです。

エラー

Error authenticating! { type: 'FeathersError', 
    name: 'NotAuthenticated', 
    message: 'Error', 
    code: 401, 
    className: 'not-authenticated', 
    errors: {} } 

のでoffcourseいくつかのファイルが必要です。最初にバックエンド側から始めましょう。私はサービスのいくつかの「クラスター」を持っているので、いくつかのコードはシフトする必要があります。

ファイル:./app.js

これは、メインアプリケーションファイルです。ここでは、テスト用に私がどのように私のユーザが作成されているかも見ています。

'use strict'; 

const path = require('path'); 
const serveStatic = require('feathers').static; 
const favicon = require('serve-favicon'); 
const compress = require('compression'); 
const cors = require('cors'); 
const feathers = require('feathers'); 
const configuration = require('feathers-configuration'); 
const authentication = require('feathers-authentication'); 
const jwt = require('feathers-authentication-jwt'); 
const local = require('feathers-authentication-local'); 
const hooks = require('feathers-hooks'); 
const rest = require('feathers-rest'); 
const bodyParser = require('body-parser'); 
const socketio = require('feathers-socketio'); 
const middleware = require('./middleware'); 
const servicesMfp = require('./services/A'); 
const servicesMic = require('./services/B'); 

const app = feathers(); 

app.configure(configuration(path.join(__dirname, '..'))); 

app.use(compress()) 
    .options('*', cors()) 
    .use(cors()) 
    .use(favicon(path.join(app.get('public'), 'favicon.ico'))) 
    .use('/', serveStatic(app.get('public'))) 
    .use(bodyParser.json()) 
    .use(bodyParser.urlencoded({extended: true})) 
    .configure(hooks()) 
    .configure(rest()) 
    .configure(socketio()) 
    .configure(servicesMfp) 
    .configure(servicesMic) 
    .configure(middleware) 
    .configure(local({ 
     usernameField: 'user_name', 
     passwordField: 'user_password' 
    })) 
    .configure(jwt()); 

app.service('/mfp/authentication').hooks({ 
    before: { 
     create: [ 
      authentication.hooks.authenticate(['jwt', 'local']), 
     ], 
     remove: [ 
      authentication.hooks.authenticate('local') 
     ] 
    } 
}); 

/* 
const userService = app.service('/mfp/sys_users'); 
const User = { 
    user_email: '[email protected]', 
    user_password: 'ekoster', 
    user_name: 'ekoster2', 
    status_id: 1 
}; 
userService.create(User, {}).then(function(user) { 
    console.log('Created default user', user); 
}); 
*/ 

module.exports = app; 

ファイル:

'use strict'; 

const authentication = require('feathers-authentication'); 

module.exports = function() { 
    const app = this; 
    let config = app.get('mfp_auth'); 

    app.configure(authentication(config)); 
}; 

ファイルを./services/multifunctionalportal/authentiction/index.js:これは

./services/multifunctionalportal/sys_user/index.jsサービスのインデックスファイルこれはまた、このデータベースに存在するデータに対して認証が実際に構成されている場所です。

'use strict'; 
const authentication = require('./authentication/index'); 
const sys_user = require('./sys_user/index'); 
const sys_metadata = require('./sys_metadata/index'); 
const sys_term = require('./sys_term'); 
const sys_source = require('./sys_source/index'); 
const sys_source_user = require('./sys_source_user/index'); 
const survey = require('./survey/index'); 
const survey_question = require('./survey_question/index'); 
const Sequelize = require('sequelize'); 

module.exports = function() { 
    const app = this; 

    //TODO make it more cross DB (different dbtypes) 
    const sequelize = new Sequelize(app.get('mfp_db_database'), app.get('mfp_db_user'), app.get('mfp_db_password'), { 
     host: app.get('mfp_db_host'), 
     port: app.get('mfp_db_port'), 
     dialect: 'mssql', 
     logging: true, 
     dialectOptions: { 
      instanceName: app.get('mfp_db_instance') 
     } 
    }); 
    app.set('mfp_sequelize', sequelize); 

    app.configure(authentication); 
    app.configure(sys_user); 
    app.configure(sys_metadata); 
    app.configure(sys_term); 
    app.configure(sys_source); 
    app.configure(sys_source_user); 
    app.configure(survey); 
    app.configure(survey_question); 

    Object.keys(sequelize.models).forEach(function(modelName) { 
     if ("associate" in sequelize.models[modelName]) { 
      sequelize.models[modelName].associate(); 
     } 
    }); 

    sequelize.sync(
     { 
      force: false 
     } 
    ); 
}; 

上記ファイルで使用されるコンフィギュレーションは、次

"mfp_auth": { 
     "path": "/mfp/authentication", 
     "service": "/mfp/sys_users", 
     "entity": "sys_user", 
     "strategies": [ 
      "local", 
      "jwt" 
     ], 
     "secret": "WHO_KNOWS" 
    } 

ファイルである:

'use strict'; 

const Sequelize = require('sequelize'); 

module.exports = function (sequelize) { 
    const sys_user = sequelize.define('sys_users', { 
     user_email: { 
      type: Sequelize.STRING(256), 
      allowNull: false, 
      unique: true 
     }, 
     user_name: { 
      type: Sequelize.STRING(256), 
      allowNull: false, 
      unique: true 
     }, 
     user_password: { 
      type: Sequelize.STRING(256), 
      allowNull: false 
     }, 
     status_id: { 
      type: Sequelize.INTEGER, 
      allowNull: false 
     } 
    }, { 
     freezeTableName: true, 
     paranoid: true, 
     timestamps : true, 
     underscored : true, 
     classMethods: { 
      associate() { 
       sys_user.belongsTo(sequelize.models.sys_metadata, { 
        allowNull: false, 
        as: 'status' 
       }); 
       sys_user.hasMany(sequelize.models.sys_source_users, { 
        as: 'user', 
        foreignKey: 'user_id', 
        targetKey: 'user_id', 
        onDelete: 'no action' 
       }); 
      } 
     } 
    }); 

    sys_user.sync(); 

    return sys_user; 
}; 

ファイルを./services/multifunctionalportal/sys_user/sys_user-model.js :./services/multifunctionalportal/sys_user/hooks/index.js

'use strict'; 

const globalHooks = require('../../../../hooks'); 
const hooks = require('feathers-hooks'); 
const authentication = require('feathers-authentication'); 
const local = require('feathers-authentication-local'); 

exports.before = { 
    all: [], 
    find: [ 
     authentication.hooks.authenticate('jwt') 
    ], 
    get: [], 
    create: [ 
     local.hooks.hashPassword({ passwordField: 'user_password' }) 
    ], 
    update: [], 
    patch: [], 
    remove: [] 
}; 

exports.after = { 
    all: [], 
    find: [], 
    get: [], 
    create: [], 
    update: [], 
    patch: [], 
    remove: [] 
}; 

次のオフコースはクライアントです。私はnuxtjsを持っていますが、私もnuxtjsではないクライアントと同じ問題があります。だから私はそれが1つのファイルであり、デバッグするのが簡単だからです。私はそれを解決するのに役立ちませんでした。このセクションの下にあるもの(無関係の)

要求

を削除するために、私は、このコードを展開することができ、必要に応じて

'use strict'; 
const feathers = require('feathers/client'); 
const socketio = require('feathers-socketio/client'); 
const hooks = require('feathers-hooks'); 
const io = require('socket.io-client'); 
const authentication = require('feathers-authentication-client'); 
const localstorage = require('feathers-localstorage'); 
const process = require('../../config'); 
const winston = require('winston'); 
const tslog =() => (new Date()).toLocaleTimeString(); 

const mfpSocket = io(process.env.backendUrl); 
const mfpFeathers = feathers() 
    .configure(socketio(mfpSocket)) 
    .configure(hooks()) 
    .configure(authentication()); 

const surveyLog = new (winston.Logger)({ 
    transports: [ 
     new (winston.transports.Console)({ 
      timestamp: tslog, 
      colorize: true 
     }), 
     new (require('winston-daily-rotate-file'))({ 
      filename: process.env.logDirectory + '/-' + process.env.logFileSurvey, 
      timestamp: tslog, 
      datePattern: 'yyyyMMdd', 
      prepend: true, 
      level: process.env.logLevelSurvey 
     }) 
    ] 
}); 


//TODO login then continue 
mfpFeathers.authenticate({ 
    strategy: 'local', 
    'user_name': 'ekoster', 
    'user_password': 'ekoster2' 
}).then(function(result){ 
    console.log('Authenticated!', result); 
}).catch(function(error){ 
    console.error('Error authenticating!', error); 
}); 

は、それは可能性のある人です正しい方向に私を向ける。カスタムフィールドを別の場所に設定する必要がありますか?私は「エラー:」に何かを入れることができるかどうかを調べるために問題を探してみましたが、「feathers-authenticate」の2つのファイルから来ているように見えましたが、どこがわからないのですか。私はこの問題を考えている

を解決

は、サービスの「index.js」内のサーバーのセットアップ、およびバックエンドの「app.js」内の一部の一部を有することです。私はまだどこに見えないのですか。

[20170612 1630]新しいファイル いくつかのファイルを調整しました。同じ結果ですが、よりよく適合します。次のステップが呼び出されていないように見えます。

ファイル:./services/multifunctionalportal/index.js

'use strict'; 
const authentication = require('./authentication/index'); 
const jwt = require('feathers-authentication-jwt'); 
const local = require('feathers-authentication-local'); 
const sys_user = require('./sys_user/index'); 
const sys_metadata = require('./sys_metadata/index'); 
const sys_term = require('./sys_term'); 
const sys_source = require('./sys_source/index'); 
const sys_source_user = require('./sys_source_user/index'); 
const survey = require('./survey/index'); 
const survey_question = require('./survey_question/index'); 
const Sequelize = require('sequelize'); 

module.exports = function() { 
    const app = this; 

    //TODO make it more cross DB (different dbtypes) 
    const sequelize = new Sequelize(app.get('mfp_db_database'), app.get('mfp_db_user'), app.get('mfp_db_password'), { 
     host: app.get('mfp_db_host'), 
     port: app.get('mfp_db_port'), 
     dialect: 'mssql', 
     logging: true, 
     dialectOptions: { 
      instanceName: app.get('mfp_db_instance') 
     } 
    }); 
    app.set('mfp_sequelize', sequelize); 

    app.configure(authentication); 
    app.configure(local({ 
     usernameField: 'user_name', 
     passwordField: 'user_password' 
    })); 
    app.configure(jwt()); 
    app.configure(sys_user); 
    app.configure(sys_metadata); 
    app.configure(sys_term); 
    app.configure(sys_source); 
    app.configure(sys_source_user); 
    app.configure(survey); 
    app.configure(survey_question); 

    Object.keys(sequelize.models).forEach(function(modelName) { 
     if ("associate" in sequelize.models[modelName]) { 
      sequelize.models[modelName].associate(); 
     } 
    }); 

    sequelize.sync(
     { 
      force: false 
     } 
    ); 
}; 

ファイル:./services/multifunctionalportal/authentication/index

'use strict'; 

const path = require('path'); 
const serveStatic = require('feathers').static; 
const favicon = require('serve-favicon'); 
const compress = require('compression'); 
const cors = require('cors'); 
const feathers = require('feathers'); 
const configuration = require('feathers-configuration'); 
const hooks = require('feathers-hooks'); 
const rest = require('feathers-rest'); 
const bodyParser = require('body-parser'); 
const socketio = require('feathers-socketio'); 
const middleware = require('./middleware'); 
const servicesMfp = require('./services/multifunctionalportal'); 
const servicesMic = require('./services/mexonincontrol'); 

const app = feathers(); 

app.configure(configuration(path.join(__dirname, '..'))); 

app.use(compress()) 
    .options('*', cors()) 
    .use(cors()) 
    .use(favicon(path.join(app.get('public'), 'favicon.ico'))) 
    .use('/', serveStatic(app.get('public'))) 
    .use(bodyParser.json()) 
    .use(bodyParser.urlencoded({extended: true})) 
    .configure(hooks()) 
    .configure(rest()) 
    .configure(socketio()) 
    .configure(servicesMfp) 
    .configure(servicesMic) 
    .configure(middleware); 

/* 
const userService = app.service('/mfp/sys_users'); 
const User = { 
    user_email: '[email protected]', 
    user_password: 'ekoster', 
    user_name: 'ekoster2', 
    status_id: 1 
}; 
userService.create(User, {}).then(function(user) { 
    console.log('Created default user', user); 
}); 
*/ 

module.exports = app; 

ファイルをapp.js .js

'use strict'; 
const authentication = require('feathers-authentication'); 

module.exports = function() { 
    const app = this; 
    const config = app.get('mfp_auth'); 
    const authService = app.service('/mfp/authentication'); 

    app.configure(authentication(config)); 

    authService.before({ 
     create: [ 
      authentication.hooks.authenticate(['jwt', 'local']), 
     ], 
     remove: [ 
      authentication.hooks.authenticate('local') 
     ] 
    }); 
}; 

[20170612 16:45]の変更は、「必要(./認証/インデックスから「./services/multifunctionalportal/index.js'での認証に必要

は、私が変更されているエラーを変える「必要」は、 ) "を" require( 'feathers-authentication')に変更すると、app.passportが見つからないということになります。また、認証ローカルの前に認証が設定されている場合

[20170612 19:00]だから、anthenticationのための私のconfig設定がサービス 'multifunctionalportal /認証' の 'index.js' にあった

認証

の設定を移動しました。私はそれを自己のサービスのindex.jsに移動しましたが、今はそのメッセージはなくなりましたが、私は今やユーザーレストークンを持っています。だから間違ったパスワードを入力しても、まだトークンが作成されています。バックエンドのログを見ると、ユーザーの選択は表示されません。

[20170612 20時】ループ

でこの最後の変化は欠落フックによって引き起こされます。認証用のフックは現在、認証サービスのindex.jsにあります。それらをapp.jsに移動すると、問題はなくなり、メッセージには認証が返されません。だから、ある種の設定が正しいとは思われません。現在、初期エラーの 'messages'部分にエラーメッセージを表示することができるかどうかを調べるには

+0

エラーを再現するために、破損リポジトリをGitHubまたはBitBucketのどこかに置くことができますか?このコードの量は、SOの質問で把握するのは難しいです。 – Daff

答えて

0

解決策はテストユーザーの挿入にシーケンス 'user_password' 'user_name'があり、ログインテストに 'user_name '' user_password '私は、ユーザー/パスワードが等しい新しいユーザーとこれを越えました。このユーザーが働いたとき、私はそれを理解しました。

パスワードに間違いがあるため、ログインに失敗したとは言わず、DEBUG=feathers-authentication* npm startと表示されます。