web-dev-qa-db-ja.com

JWTを使用した認証Laravel 5パスワードなし

私はLaravelを学ぼうとしています。私の目標は、RESTful APIを構築できるようにすることです(ビューやブレードを使用せず、JSONの結果のみです。後でAngularJSWebアプリとCordovaハイブリッドモバイルアプリはこのAPIを消費します。

いくつかの調査の後、私は完全にステートレスな利益のためにJWT-Authライブラリを選択する傾向があります。私の問題は次のとおりです:私には2つの主要なタイプのユーザーがいます:customersmoderators。お客様はパスワードを持っている必要はありません。提供された電子メールでのみアクセスするためのトークンを生成できる必要があります。その電子メールがデータベースに存在し、それが顧客のものである場合、トークンが生成されて返されます。存在し、モデレーターに属している場合は、falseを返すため、インターフェイスはパスワードを要求できます。電子メールが存在しない場合、無効なパラメータエラーがスローされます。

ドキュメントを読みました ここ そしてそれはカスタムクレームを使用することが可能であると言っています。ただし、ドキュメントでは、クレームとは何か、および配列がカスタムクレームとして渡されることの意味については説明されていません。上で説明したことを達成するための方法について、いくつかの意見をお願いします。

    <?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;


class AuthenticateController extends Controller
{

    public function authenticate(Request $request)
    {
        $credentials = $request->only('email', 'password');

        try {
            // verify the credentials and create a token for the user
            if (! $token = JWTAuth::attempt($credentials)) {
                return response()->json(['error' => 'invalid_credentials'], 401);
            }
        } catch (JWTException $e) {
            // something went wrong
            return response()->json(['error' => 'could_not_create_token'], 500);
        }

        // if no errors are encountered we can return a JWT
        return response()->json(compact('token'));
    }
}

ありがとうございます。

更新

バウンティのコード

public function authenticate(Request $request) { 
    $email = $request->input('email');
    $user = User::where('email', '=', $email)->first();
    try { 
        // verify the credentials and create a token for the user
        if (! $token = JWTAuth::fromUser($user)) { 
            return response()->json(['error' => 'invalid_credentials'], 401);
        } 
    } catch (JWTException $e) { 
        // something went wrong 
        return response()->json(['error' => 'could_not_create_token'], 500); 
    } 
    // if no errors are encountered we can return a JWT 
    return response()->json(compact('token')); 
}
16

これで試してください:

$user=User::where('email','=','[email protected]')->first();

if (!$userToken=JWTAuth::fromUser($user)) {
            return response()->json(['error' => 'invalid_credentials'], 401);
        }

return response()->json(compact('userToken'));

それは私のために働きます、希望は助けることができます

27
Alimjan

顧客用のトークンの生成(パスワードなし)は、

_$user = \App\Modules\User\Models\UserModel::whereEmail('[email protected]')->first();
$userToken=JWTAuth::fromUser($user);
_

ここで、_$userToken_は、電子メールの存在チェック後にトークンをUserModelファイルで構成されたテーブルに格納します。

顧客とモデレーターの両方を同じテーブルに格納すると仮定しました。それらを区別するためのフラグが必要です。フラグがuser_typeであると想定します

_$token = null;
$user = \App\Modules\User\Models\UserModel::whereEmail('[email protected]')->first();
if($user['user_type'] == 'customer'){
   $credentials = $request->only('email');
   $token =JWTAuth::fromUser($user);
}else if($user['user_type'] == 'moderator'){
   $credentials = $request->only('email','password');
   $token = JWTAuth::attempt($credentials);
}else{
   //No such user exists

}
return $token;
_

カスタムクレームに関する限り、これらはトークン文字列に添付できるカスタム定義のペイロードです。

たとえば、JWTAuth::attempt($credentials,['role'=>1]);はトークンペイロードにロールオブジェクトを追加しようとします。 JWTファサードJWTAuth::parseToken()->getPayload();を介してトークン文字列をデコードすると、config/jwt.phpの下のrequired_claimsで定義されているすべてのペイロードを取得します。追加のroleペイロード。

参照 https://github.com/tymondesigns/jwt-auth/wiki/Creating-Tokens#creating-a-token-based-on-anything-you-like 必要な場合はお知らせください他に何か。

7
Ashu Jha

顧客とモデレーターに対して異なるログイン戦略を作成するのではなく、両方のユーザータイプにトークン認証を追加できます。これにより、作業が楽になり、スケーラビリティの準備が整います。 APIでは、送信することで、モデレーターユーザーがAPIにアクセスできないように制限できます。

<?php
Response::json('error'=>'method not allowed')

この提案とは別に、@ Alimnjanコードは機能するはずです。

0
evanxg852000