2017-10-02 6 views
0

私は最初のNodeJsアプリケーションを構築し始めました。私はAdonisJsフレームワークを使用しています。ユーザーログインのAdonisJsユーザー認証が失敗する

ユーザーが登録された場所から簡単なユーザー登録ページを作成しました。その後、そのユーザーをログインさせるログインページに行くと、request.auth.attempt(email, password)メソッドは既存のユーザーを認証しません。

のconfig/auth.js

authenticator: 'session', 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Authenticator 
    |-------------------------------------------------------------------------- 
    | 
    | Session authenticator will make use of sessions to maintain the login 
    | state for a given user. 
    | 
    */ 
    session: { 
    serializer: 'Lucid', 
    model: 'App/Model/User', 
    scheme: 'session', 
    uid: 'email', 
    password: 'password' 
    }, 

routes.js

const Route = use('Route') 

// Register 
Route.get('register', 'AuthController.showRegisterPage') 
Route.post('register', 'AuthController.register') 

// Login 
Route.get('login', 'AuthController.showLoginPage') 
Route.post('login', 'AuthController.login') 

// Logout 
Route.get('logout', 'AuthController.logout') 

AuthController.js//

/** 
    * Handle user registration 
    */ 
    * register(request, response) { 

     // validate form input 
     const rules = { 
      name: 'required', 
      username: 'required|unique:users', 
      email: 'required|email|unique:users', 
      password: 'required|confirmed|min:6' 
     } 

     const messages = { 
      'name.required': 'Name field is required.', 
      'username.required': 'Username field is required.', 
      'username.unique': 'Username field must have a unique value.', 
      'email.required': 'Email field is required.', 
      'email.unique': 'Email field must have a unique value.', 
      'password.required': 'Password field is required.', 
      'password.confirmed': 'Password/Confirm Password fields does not match.' 
     } 

     const validation = yield Validator.validateAll(request.all(), rules, messages) 

     // show error messages upon validation fail 
     if (validation.fails()) { 
      yield request 
       .withAll() 
       .andWith({ errors: validation.messages() }) 
       .flash() 

      return response.redirect('back') 
     } 

     const user = new User() 
     user.name = request.input('name') 
     user.username = request.input('username') 
     user.email = request.input('email') 
     user.password = yield Hash.make(request.input('password')) 
     yield user.save() 

     yield response.sendView('auth.register', {message: {type: 'success', text: 'Registration successful. You can login now.'} }) 

    } 

AuthController.jsを登録:ここでは私がこれまでにコード化されてきたものですログイン

/** 
    * Handle user authentication 
    */ 
    * login(request, response) { 

     const email = request.input('email') 
     const password = request.input('password') 

     // validate form input 
     const rules = { 
      email: 'required|email', 
      password: 'required' 
     } 

     const messages = { 
      'email.required': 'Email field is required.', 
      'password.required': 'Password field is required.' 
     } 

     const validation = yield Validator.validateAll(request.all(), rules, messages) 

     // show error messages upon validation fail 
     if (validation.fails()) { 
      yield request 
       .withAll() 
       .andWith({ errors: validation.messages() }) 
       .flash() 

      return response.redirect('back') 
     } 

     try { 

      yield request.auth.attempt(email, password) 
      response.route('/') 

     } catch (e) { 

      yield response.sendView('auth.login', {message: {type: 'error', text: 'Invalid credentials. Please try again.'} }) 

     } 

    } 

アプリ/モデル/ユーザー

'use strict' 

const Lucid = use('Lucid') 
const Hash = use('Hash') 

class User extends Lucid { 

    static boot() { 
    super.boot() 

    /** 
    * Hashing password before storing to the 
    * database. 
    */ 
    this.addHook('beforeCreate', function * (next) { 
     this.password = yield Hash.make(this.password) 
     yield next 
    }) 
    } 

    apiTokens() { 
    return this.hasMany('App/Model/Token') 
    } 

} 

module.exports = User 

私がログインしようとするたびに、それは常にログイン方法でcatch一部を実行します。何が起こっているのか分かりません。誰か助けてください。

答えて

2

これは、パスワードを2回ハッシュしているためです。

Userモデルを見ると、パスワードをデータベースに作成する前にbcryptでハッシュするフックがあります。

登録ワークフローでは、パスワードもハッシュしています。

const user = new User() 
user.name = request.input('name') 
user.username = request.input('username') 
user.email = request.input('email') 
user.password = yield Hash.make(request.input('password')) // here 
yield user.save(). 

これが機能しない理由です。
コントローラメソッドでハッシング部分を削除する必要があります。

Adonis 4.0がリリースされているので、新しいプロジェクトを開始する場合は、3.2を使用する代わりにこのバージョンを使用することをお勧めします。

+0

あなたは天才です。どうもありがとう :) – Ali

関連する問題