我正在尝试学习Laravel,我的目标是能够构建RESTful API(不使用视图或刀片,只使用JSON结果。稍后,AngularJS Web应用程序和Cordova混合移动应用程序将消耗这个api。
经过一番研究,我倾向于选择JWT-Auth库来获得完全无国籍的好处。我的问题是:我有两种主要类型的用户:客户和主持人。客户无需拥有密码。我需要能够使用提供的电子邮件生成用于访问的令牌。如果该电子邮件存在于数据库中且属于客户,则它将生成并返回该令牌。 如果它存在且属于主持人,则它将返回false,因此接口可以请求密码。如果电子邮件不存在,则会引发无效的参数错误。
我阅读了文档here,并说它可以使用自定义声明。但是文档并没有解释什么是声明,以及数组作为自定义声明传递的含义。我想了解如何实现我上面解释的内容。
<?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'));
}
}
谢谢你。
Bounty的代码
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'));
}
答案 0 :(得分:24)
试试这个:
$user=User::where('email','=','user2@gmail.com')->first();
if (!$userToken=JWTAuth::fromUser($user)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
return response()->json(compact('userToken'));
它对我有用,希望可以帮助
答案 1 :(得分:7)
可以通过
实现为客户生成令牌(无密码)$user = \App\Modules\User\Models\UserModel::whereEmail('xyz@gmail.com')->first();
$userToken=JWTAuth::fromUser($user);
此处$userToken
将在UserModel文件中配置的表中存在电子邮件检查后存储令牌。
我假设您将客户和版主存储在同一个表中,必须有一些标志来区分它们。假设标志是user_type
$token = null;
$user = \App\Modules\User\Models\UserModel::whereEmail('xyz@gmail.com')->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 Facade JWTAuth::parseToken()->getPayload();
解码令牌字符串后,您将获得在config / jwt.php下的 required_claims 中定义的所有有效负载以及其他角色有效负载。
参考https://github.com/tymondesigns/jwt-auth/wiki/Creating-Tokens#creating-a-token-based-on-anything-you-like 如果您需要其他任何内容,请告诉我。
答案 2 :(得分:-1)
您可以为两种用户类型添加令牌身份验证,而不是为客户和版主制定不同的登录策略。这将使您的生活更轻松,并为可扩展性做好准备。 在您的api中,您可以通过发送
来限制版主用户无法访问API
<?php
Response::json('error'=>'method not allowed')
除了这个建议,我相信@Alimnjan代码应该有用。