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

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

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《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年前

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