2016-05-22 3 views
4

LaravelのWebサイトに次のフォルダがあります。Authミドルウェアとトークンベースの認証でのみストレージフォルダ内のファイルにアクセス

/ストレージ/資産/メディア

このフォルダには

/storage/Asset/Media/1/abc.png

/ストレージ/資産以下のような情報を持つことができます/ Media/2/abc.png

ここで1または2がフォルダ名です。

私は誰もユーザーのセッションがブラウザに有効期限が切れていないされるまで、ファイルにアクセスすることができ、このように誰に

Route::group(['middleware' => ['web', 'auth']], function() { 
    Route::get('/storage/Asset/Media/{ID}/{eded}', array(
     'as' => 'Files', 
     'uses' => 'User\Account\Media\[email protected]', 
    )); 
}); 

ので、認証なしでフォルダにアクセスできないようにフォルダを確保するためのコードを次しています。

問題はAndroidにあるため、誰もAuth Middlewareのためにファイルにアクセスすることはできません。

誰かが、トークンベースの認証(Android経由)やAuthコントローラ(Webサイト経由)を介してファイルをダウンロードしてダウンロードすることができますか?

+0

私の理解によれば、ログイン時にはトークンをヘッダーに設定する必要があります。誰かが何らかのリソースを探している場合、毎回トークンをヘッダーに送る必要があります。トークンが検証された場合は、リソースを提供します。 –

+0

はい。私はすでに 'auth Middleware'の下でリソースのためのパスを設定しました。だから、私は 'auth:api'のためにそれをどうやって行うことができますか? – Pankaj

+0

ミドルウェアは認証を行います。ミドルウェアはエントリポイントです。トークンが妥当性検査された場合は、APIのみが呼び出されます。それ以外の場合は、ミドルウェアから返されます。お使いのコントローラで –

答えて

3

あなたは、このガイドに従うならば、すべてがうまく動作しますが、routes.php内の他の設定を使用する必要はありません。

最も簡単な解決策はapi_tokenという名前の列を作成することですusersテーブルです。次に、アンドロイドデバイスからリソースにアクセスしようとしている場合は、?api_token=<token>をあなたのURLに追加してください。<token>は、usersテーブルのapi_tokenの列です。例えば

domain.com/storage/Asset/Media/1/2?api_token=123hello4secret

システムは、これだけあなたのユーザーapi_tokenフィールドにその123hello4secretを入れ、api_token == 123hello4secretを持つユーザレコードを検索しようとします。


あなたがすべきapi_tokenが列名として、答えはここにあるなぜあなたは不思議場合:https://github.com/laravel/framework/blob/2a38acf7ee2882d831a3b9a1361a710e70ffa31e/src/Illuminate/Auth/TokenGuard.php#L45 Laravelは、それが要求フィールドに発見された場合は、api_tokenを使用して認証するためにしようとします。


また、あなたはトークンを認可するHTTPヘッダーを使用することができます
ヘッダーの例:ユーザーテーブルで

Authorization: Bearer 123hello4secret 
0

あなたは、これはLaravelのAPI認証を使用して非常に簡単ですauth:apiミドルウェア

以内に新しいルートをラップする必要があります。

0

あなたはコードで/ストレージ/資産/メディアで

を.htaccessファイルを置くことができます:あなたはPHPでファイルにアクセスすることができますが、ファイルへの直接リンクは機能しません

<IfModule mod_rewrite.c> 
    <IfModule mod_negotiation.c> 
     Options -MultiViews 
    </IfModule> 

    RewriteEngine On 

    # Redirect Trailing Slashes If Not A Folder... 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)/$ /$1 [L,R=301] 

    # Handle Front Controller... 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule^index.php [L] 

    # Handle Authorization Header 
    RewriteCond %{HTTP:Authorization} . 
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 
</IfModule> 

0

経由api_token

今すぐたびにユーザーログインNULL可能列を作りますApi、api_tokenをdbに設定し、これをApiコンシューマに送信します。

さらにリクエストして、Apiコンシューマはリクエストヘッダーにトークンを返します。だから認証ミドルウェアを設定:

public function handle($request, Closure $next) 
    { 
     if(!empty($request->header('Auth-Token'))) { 
     $api_token = $request->header('Auth-Token'); 
     $user = User::where('api_token', $api_token)->first(); 
     if(is_null($user)) //Unauthorize: write response to return 
     } elseif ($this->auth->guest()) { 
     if ($request->ajax()) { 
      return response('Unauthorized.', 401); 
     } else { 
      return redirect()->guest('/'); 
     } 
    } 

     return $next($request); 
    } 
+0

'api_token'を介した認証のための機能を追加する必要はありません。それは、ボックスの機能の、私の答えを参照してください。 –

1

注デフォルトでは「ストレージ」フォルダがとにかくアクセスできないこと - のみの公開」フォルダが公にアクセス可能です。したがって、ファイルダウンロードコントローラには任意のURLを使用できます。また、あなたのusersテーブルにトークンフィールドを追加する必要が

// URL can be anything you want 
Route::get('downloads/{ID}/{eded}', [ 
     'middleware' => ['web', 'auth'], 
     'as' => 'Files', 
     'uses' => '[email protected]', 
]); 

// For API tokens, use 'api' guard of Auth middleware 
// URL has to be different, too 
Route::get('api/downloads/{ID}/{eded}', [ 
     'middleware' => ['auth:api'], 
     'as' => 'Files', 
     'uses' => '[email protected]', 
]); 

:クッキーベースの認証(Webユーザ)用とステートレス(トークン)のセッションのための1 -

は、次の2つのルートが必要です。

$table->string('api_token', 60)->unique(); 

次に、このトークンを生成する必要があります。同じトークンを使用する場合(有効期限やリフレッシュなし)、新しいユーザーが作成されたときにそのトークンを生成できます。あなたはすべてのログイン試行にリフレッシュされる(AuthControllerでpostLogin)トークンを強制または多分トークンのためにメールアドレスとパスワードを交換し、別のコントローラメソッドを持っている可能性があり、そうでなければ

/** 
* @return void 
*/ 
public function boot() 
{ 
    User::creating(function ($user) { 
     $user->api_token = str_random(60); 
    }); 
} 

:あなたのUserクラスでこれを持っている可能性があり。

関連する問題