【问题标题】:Authentication with JWT Laravel 5 without password使用 JWT Laravel 5 进行身份验证,无需密码
【发布时间】:2016-01-06 20:00:21
【问题描述】:

我正在尝试学习 Laravel,我的目标是能够构建一个 RESTful API(不使用视图或刀片,只有 JSON 结果。稍后,AngularJS 网络应用程序和 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'));
    }
}

谢谢。

更新

赏金代码

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')); 
}

【问题讨论】:

    标签: php angularjs authentication jwt


    【解决方案1】:

    试试这个:

    $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'));
    

    对我有用,希望能帮到你

    【讨论】:

    • 我尝试使用未存储在数据库中的电子邮件在邮递员中运行它,但它向我发送了如下错误:
      JWTAuth.php 第 93 行中的 ErrorException:尝试获取非对象
    • @Dhenn 尝试通过 if 检查来验证 first() 是否返回任何结果。 if(!$user) { return response()-&gt;json(['error' =&gt; 'invalid_credentials'], 401); }。仅在此检查之后尝试生成令牌。
    • 谢谢你 :) 到今年为止仍然有帮助 xD
    • 如果您需要添加自定义声明,请使用: if (!$userToken=JWTAuth::customClaims(['test' => 123])->fromUser($user) ){... .}
    【解决方案2】:

    为客户生成令牌(无需密码)可以通过

    $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'=&gt;1]); 将尝试将角色对象添加到令牌有效负载。 通过 JWT Facade JWTAuth::parseToken()-&gt;getPayload(); 解码令牌字符串后,您将获得在 config/jwt.php 下的 required_claims 中定义的所有有效负载以及额外的 role 有效负载。

    参考https://github.com/tymondesigns/jwt-auth/wiki/Creating-Tokens#creating-a-token-based-on-anything-you-like 让我知道,以防您需要其他任何东西。

    【讨论】:

      【解决方案3】:

      您可以为两种用户类型添加令牌身份验证,而不是为客户和版主制定不同的登录策略。这将使您的生活更轻松,并为可扩展性做好准备。 在您的 api 中,您可以通过发送

      来限制版主用户无法访问该 api

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

      除了这个建议,我相信@Alimnjan 代码应该可以工作。

      【讨论】:

        【解决方案4】:

        如果您还没有 App\User 对象,请使用类似的东西获取它

        $user = App\User::find(1);
        

        使用JWTAuthfromUser()方法生成令牌

        $token = \JWTAuth::fromUser($user)
        

        上面没有对用户进行身份验证,它只生成一个 JWT 令牌。如果您需要对用户进行身份验证,则必须添加类似这样的内容

        \JWTAuth::setToken($token)->toUser();
        

        【讨论】:

          猜你喜欢
          • 2017-01-26
          • 2018-06-18
          • 1970-01-01
          • 2016-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-13
          相关资源
          最近更新 更多