Auth::guard ('API')->attempt ($credentials)) 到底是什么?

if (!$token = \Auth::guard('api')->attempt($credentials)) {
return $this->response->errorUnauthorized('用户名或密码错误');
}
attempt 不是根据数据库中的值进行比对返回true or false 么。为什么这里返回token。 教程还说能返回过期时间。。求指点代码看的有点蒙逼。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
liyu001989
最佳答案

这部分是 laravel guard 的知识

我们在 config/auth 中设置了不同的guard

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

\Auth::guard('api') 意思是使用 api guard,根据配置使用的 driver 是jwt,provider 是 users。

driver jwt 在 jwt-auth 这个扩展中定义了

vendor/tymon/jwt-auth/src/Providers/AbstractServiceProvider.php

.
.
.
    protected function extendAuthGuard()
    {
        $this->app['auth']->extend('jwt', function ($app, $name, array $config) {
            $guard = new JwtGuard(
                $app['tymon.jwt'],
                $app['auth']->createUserProvider($config['provider']),
                $app['request']
            );

            $app->refresh('request', $guard, 'setRequest');

            return $guard;
        });
    }
.
.
.

你会看到最终是执行的 vendor/tymon/jwt-auth/src/JwtGuard.php 中的 attempt 方法

    public function attempt(array $credentials = [], $login = true)
    {
        $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);

        if ($this->hasValidCredentials($user, $credentials)) {
            return $login ? $this->login($user) : true;
        }

        return false;
    }

所以最后返回了token

似乎可以发一篇帖子专门说明一下这个问题 :smile:

5年前 评论
讨论数量: 11
liyu001989

这部分是 laravel guard 的知识

我们在 config/auth 中设置了不同的guard

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

\Auth::guard('api') 意思是使用 api guard,根据配置使用的 driver 是jwt,provider 是 users。

driver jwt 在 jwt-auth 这个扩展中定义了

vendor/tymon/jwt-auth/src/Providers/AbstractServiceProvider.php

.
.
.
    protected function extendAuthGuard()
    {
        $this->app['auth']->extend('jwt', function ($app, $name, array $config) {
            $guard = new JwtGuard(
                $app['tymon.jwt'],
                $app['auth']->createUserProvider($config['provider']),
                $app['request']
            );

            $app->refresh('request', $guard, 'setRequest');

            return $guard;
        });
    }
.
.
.

你会看到最终是执行的 vendor/tymon/jwt-auth/src/JwtGuard.php 中的 attempt 方法

    public function attempt(array $credentials = [], $login = true)
    {
        $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);

        if ($this->hasValidCredentials($user, $credentials)) {
            return $login ? $this->login($user) : true;
        }

        return false;
    }

所以最后返回了token

似乎可以发一篇帖子专门说明一下这个问题 :smile:

5年前 评论
liyu001989

这部分是 laravel guard 的知识

我们在 config/auth 中设置了不同的guard

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

\Auth::guard('api') 意思是使用 api guard,根据配置使用的 driver 是jwt,provider 是 users。

driver jwt 在 jwt-auth 这个扩展中定义了

vendor/tymon/jwt-auth/src/Providers/AbstractServiceProvider.php

.
.
.
    protected function extendAuthGuard()
    {
        $this->app['auth']->extend('jwt', function ($app, $name, array $config) {
            $guard = new JwtGuard(
                $app['tymon.jwt'],
                $app['auth']->createUserProvider($config['provider']),
                $app['request']
            );

            $app->refresh('request', $guard, 'setRequest');

            return $guard;
        });
    }
.
.
.

你会看到最终是执行的 vendor/tymon/jwt-auth/src/JwtGuard.php 中的 attempt 方法

    public function attempt(array $credentials = [], $login = true)
    {
        $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);

        if ($this->hasValidCredentials($user, $credentials)) {
            return $login ? $this->login($user) : true;
        }

        return false;
    }

所以最后返回了token

似乎可以发一篇帖子专门说明一下这个问题 :smile:

5年前 评论

file
始终报用户名和密码错误

file
这是已有的数据库数据,是不是因为和laravel的加密方式不同,所以一直为false
@liyu001989

5年前 评论
liuhanjia 4年前
liyu001989

@Promisehp 不是,最终使用的验证都是一样的,你首先得确定你的密码是正确的

file

5年前 评论

@Promisehp 是的 laravel 默认是bcrypt 加密方式, 更改加密方式可以在config/hashing.php下面改 不过只支持bcrypt跟argon, 原因大概是因为安全吧, 常规哈希容易被彩虹表等暴力破解

5年前 评论
liyu001989

@Promisehp 那你的密码就是不对啊,请仔细看教程,跟着教程走,学会了之后再自己修改。

加密方式是算法问题,跟语言没关系

5年前 评论
liyu001989

token 跟验证的关系是 1. 验证用户身份,2,为用户生成密码。

验证你按你自己的规则来,验证完了, auth('api')->fromUser($user) 就可以生成token

5年前 评论
qinwei 4年前
czy2020

Interface 'Tymon\JWTAuth\Contracts\JWTSubject' not found user模型实现这个jwt后,在api 方面里面使用模型 提示这个找不到,是啥问题啊,

file

5年前 评论

跟着教程还是报密码错误

5年前 评论

@liyu001989
很有必要单独讲解一下
-,-

5年前 评论

密码默认bcrypt,rounds=10!123456==>$2a$10$PdvngNrlKkRChQOLF4nnFOy856TTVKCGJljdxSb8MWVkLTyGoCpui

4年前 评论
放逐之名 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!