【问题标题】:Laravel 5.3 Passport JWT AuthenticationLaravel 5.3 Passport JWT 身份验证
【发布时间】:2017-05-13 14:45:41
【问题描述】:

早些时候,当我使用 laravel 5.2 时,我使用第三方包 https://github.com/tymondesigns/jwt-auth/ 进行基于 JWT 的身份验证。我们只需传递用户名和密码即可获得令牌。

现在在 laravel 5.3 中引入了护照,我想进行基于 JWT 的身份验证,但护照要求我指定 client_id 和 client_secret 以及用户名和密码。 tymondesigns/jwt-auth 中没有。

如果我在没有 client_id 的情况下发出请求,则会引发错误 http://pix.toile-libre.org/upload/original/1482908288.png,但是当我传递 client_id 和 client_secret 时,它可以正常工作 http://pix.toile-libre.org/upload/original/1482908143.png

如何在 laravel 5.3 和护照中仅使用用户名和密码而不指定 client_id 和 client_secret 来发出 JWT 请求。

【问题讨论】:

    标签: laravel-5.3


    【解决方案1】:

    所以,最后我要回答我自己的问题。希望这会帮助面临类似问题的人。

    JWT 身份验证可以使用 Laravel 5.3 护照完成,只需按照以下步骤操作:

    或按照以下步骤操作:

    • 作曲家需要 laravel/passport
    • Laravel\Passport\PassportServiceProvider::class, 添加到您的应用提供商
    • php 工匠迁移
    • php 工匠护照:安装
    • HasApiTokens 特征添加到您的用户模型中
    • 护照::路线();在 AppServiceProvider 中
    • 将 api 驱动程序配置为护照

    完成后,创建一个 UserController 并在其中添加以下方法:

    public function auth(Request $request)
    {
    
      $params = $request->only('email', 'password');
    
      $username = $params['email'];
      $password = $params['password'];
    
      if(\Auth::attempt(['email' => $username, 'password' => $password])){
        return \Auth::user()->createToken('my_user', []);
      }
    
      return response()->json(['error' => 'Invalid username or Password']);
    }
    
      public function index(Request $request)
      {
        return $request->user();
      }
    

    在 routes/api.php 中,添加以下路由:

    Route::post('auth', 'UserController@auth');
    
    Route::group(['middleware' => 'auth:api'], function(){
    
      Route::resource('user', 'UserController@index');
    
    });
    

    现在使用屏幕截图所示的电子邮件地址和密码(http://pix.toile-libre.org/upload/original/1483094937.png)向http://localhost:8000/auth 发出 POST 请求,这将获得 accessToken,您可以使用此令牌进行其他操作应用程序中带有 Authorization 标头和 Bearer XXX 的请求,其中 xxx 是您从 /api/auth 端点收到的 accessToken

    现在,使用 Authorization 标头和令牌值向 /api/user 发出 GET 请求,这将返回经过身份验证的用户的详细信息。 (例如:http://pix.toile-libre.org/upload/original/1483095018.png

    我还在我的博客http://chatterjee.pw/larvel-passport-jwt-authentication/上发布了这些步骤

    我希望这会有所帮助!

    【讨论】:

    • 我们可以制作自定义令牌吗?不是来自用户的对象
    • 感谢您的分享,但是:1.没有refresh_token 2.我这里没有找到JWT相关人员,就是access_token 3.我不明白你为什么花了这么多时间上,它是“Auth”的“attempt()”方法和“HasApiTokens”特征的“createToken()”方法
    • 此令牌解决方案绝对不是 JWT,因此不是您原始问题的答案,这会使此问题和答案对其他人产生误导。由于这里的问答,浪费了很多时间认为这是 JWT 解决方案。
    • 这不是智威汤逊。它是带有自定义路由的纯粹简单的护照身份验证。
    • 这是个人访问令牌,而不是 JWT。这是一种安全责任,使个人访问令牌在客户端 javascript 中可用,因为它们永不过期,并且如果您没有仔细设计您的范围和中间件,通常会让用户完全访问您的 api,具体取决于您的应用程序的性质和访问控制。
    【解决方案2】:

    如果你对 OAuth 和 Client 的东西不感兴趣,你可能想使用纯 JWT 身份验证,如果是这样,你可以查看这个包:

    https://github.com/miladrahimi/larajwt

    它声明了一个名为“jwt”的新身份验证驱动程序来保护您的身份验证路由,它提供了一个从您的用户生成 jwt 的服务,以及一些其他工具,如注销、用户模型缓存、用于检查用户额外属性的过滤器等开。

    【讨论】:

    • 与 Passport 相比,我发现您的包裹更易于使用。我通常不需要为我的 API 定义客户端管理。您是否建议仍然使用 Passport?我问是因为 larajwt 包已经存档。谢谢。
    • @JCarlos,其实我没有时间继续开发这个包,但你应该知道这个包工作正常,你可以分叉,这样如果有错误,你可以修复错误。
    【解决方案3】:

    $request->user();对我不起作用,因为中间件配置为 web,我也需要 + api。文档不清楚如何控制这两种情况。

    我能够通过 get Auth Bearer + token 以及在 Laravel 上获取用户详细信息:

    use Illuminate\Support\Facades\Auth;
    
    Route::get('/user', function() {
       return Auth::guard('api')->user();
    });
    

    【讨论】:

      【解决方案4】:

      你把这一切搞混了。 Passport 非常适合您希望用户的客户端安全地向您的 API 进行身份验证的类似 Facebook 的应用程序。

      如果您正在做的只是构建一个休息 API,例如一个健康和健身应用程序,那么使用 Tyson JWT 包就足够了。这是因为你没有中间人。

      【讨论】:

        猜你喜欢
        • 2020-08-17
        • 2019-03-28
        • 2018-06-10
        • 2016-01-02
        • 2017-09-01
        • 2020-03-18
        • 2020-01-05
        • 2018-04-16
        • 2019-01-22
        相关资源
        最近更新 更多