2017-10-03 21 views
0

私はlaravel 5.4を使用してAPIを構築しています。ここでは、ユーザーがパスワードをリセットしたときにトークンをメールで送信します。現在送られてきたトークンは64文字で、ユーザが掴むには大きすぎます。laravelがトークンにカスタムの長さを与える設定をしているのかどうか分かりません。定義するためにIlluminate\Auth\Passwords\DatabaseTokenRepositoryを拡張するクラスを作成し、標準DatabaseTokenRepositoryLaravel 5.4:パスワードリセットトークンカスタム長?

を拡張 -

STEP 1:

答えて

3

ソリューションは少しトリッキー、病気の試みは、できるだけ明確に手順を説明することです新しいトークン作成ポリシー

<?php 

namespace App\Auth\Passwords; 

use Illuminate\Auth\Passwords\DatabaseTokenRepository; 

class CustomDatabaseTokenRepository extends DatabaseTokenRepository 
{ 

    // Overrides the standard token creation function 
    public function createNewToken() 
    { 
     retrun substr(parent::createNewToken(), 0, 30); 
    } 

} 

Laravelによって生成されたトークンを30文字まで切り捨てただけで、独自のトークン生成ルーチンを実装することができます。

STEP 2 - 今、あなたはあなたのトークンのリポジトリの代わりに、標準のいずれかを使用するPasswordBrokerManagerに指示する必要があり

標準PasswordBrokerManagerを拡張します。これを行うには、クラスIlluminate\Auth\Passwords\PasswordBrokerManagerを拡張する必要があります。

<?php 

namespace App\Auth\Passwords; 

use Illuminate\Auth\Passwords\PasswordBrokerManager; 

class CustomPasswordBrokerManager extends PasswordBrokerManager 
{ 

    // Override the createTokenRepository function to return your 
    // custom token repository instead of the standard one 
    protected function createTokenRepository(array $config) 
    { 
     $key = $this->app['config']['app.key']; 

     if (Str::startsWith($key, 'base64:')) { 
      $key = base64_decode(substr($key, 7)); 
     } 

     $connection = isset($config['connection']) ? $config['connection'] : null; 

     return new CustomDatabaseTokenRepository(
      $this->app['db']->connection($connection), 
      $this->app['hash'], 
      $config['table'], 
      $key, 
      $config['expire'] 
     ); 
    } 

} 

STEP 3 - 今、あなたはあなたのCustomPasswordBrokerManagerをインスタンス化するためにLaravelを伝えるために標準Illuminate\Auth\Passwords\PasswordResetServiceProviderを拡張する必要が標準PasswordResetServiceProvider

を拡張します。

// Illuminate\Auth\Password\PasswordResetServiceProvider::class,

し、[追加: -

<?php 

namespace App\Auth\Passwords; 

use Illuminate\Auth\Passwords\PasswordResetServiceProvider; 

class CustomPasswordResetServiceProvider extends PasswordServiceProvider 
{ 

    // Override the method registerPasswordBroker 
    // in order to specify your customized manager 
    protected function registerPasswordBroker() 
    { 
     $this->app->singleton('auth.password', function ($app) { 
      return new CustomPasswordBrokerManager($app); 
     }); 

     $this->app->bind('auth.password.broker', function ($app) { 
      return $app->make('auth.password')->broker(); 
     }); 
    } 
} 

STEP 4最後のステップは、config/app.php

コメントアウトキーprovidersの下にconfig/app.phpファイルに次の行をして、プロバイダを置き換えますすぐ下の行:

App\Auth\Passwords\CustomPasswordResetServiceProvider::class,

考察

は、そのようなことをやったときに、トークンが)$this->hasKeyenv('APP_KEYあるhash_hmac('sha256', Str::random(40), $this->hashKey)として定義されるように注意してください。これは、パスワードリセットトークンを生成する際に衝突が発生しないようにするために使用されます。あなたのトークンの長さを安全に減らすための安全な方法を調べることをお勧めします。

+0

はい私は、laravelも簡単な解決策を提供していないのと同じ理由だと思います。私はそれが安全ではないと分かり、別の解決策を続けました。ありがとう@ Desh901私は、あなたがソリューションに関するセキュリティ上の懸念を述べているので、私はあなたの質問の答えとしてあなたを受け入れるだろうと思います。 – blazR

+0

喜んで助けます;) – Desh901