私はLaravelを学ぼうとしています。私の目標は、RESTful APIを構築できるようにすることです(ビューやブレードを使用せず、JSONの結果のみです。後でAngularJSWebアプリとCordovaハイブリッドモバイルアプリはこのAPIを消費します。
いくつかの調査の後、私は完全にステートレスな利益のためにJWT-Authライブラリを選択する傾向があります。私の問題は次のとおりです:私には2つの主要なタイプのユーザーがいます:customersとmoderators。お客様はパスワードを持っている必要はありません。提供された電子メールでのみアクセスするためのトークンを生成できる必要があります。その電子メールがデータベースに存在し、それが顧客のものである場合、トークンが生成されて返されます。存在し、モデレーターに属している場合は、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'));
}
これで試してください:
$user=User::where('email','=','[email protected]')->first();
if (!$userToken=JWTAuth::fromUser($user)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
return response()->json(compact('userToken'));
それは私のために働きます、希望は助けることができます
顧客用のトークンの生成(パスワードなし)は、
_$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 必要な場合はお知らせください他に何か。
顧客とモデレーターに対して異なるログイン戦略を作成するのではなく、両方のユーザータイプにトークン認証を追加できます。これにより、作業が楽になり、スケーラビリティの準備が整います。 APIでは、送信することで、モデレーターユーザーがAPIにアクセスできないように制限できます。
<?php
Response::json('error'=>'method not allowed')
この提案とは別に、@ Alimnjanコードは機能するはずです。