laravel使用jwt做小程序认证,不使用默认的password字段

我在做小程序登录状态认证,小程序登录前端已经发送 code 给我,向微信认证过了,所以我觉得已经不需要 password 了。#

我用的是 tymon/jwt-auth,好像默认必须要使用 password 做验证,如果只是改名的话,就简单了,可去掉 password 这个字段的话,貌似只能在源码里做改动了#

各位老哥,有办法在不改动源码的情况下 ,去掉 password 字段做小程序登录验证吗?#

对了,我还用了多表验证隔离,现在代码是这样的#

user.php#
<?php
namespace App\Model;

/**
 * 店铺模型,店铺登录模型
 */
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class Shop extends Authenticatable implements JWTSubject
{
    use Notifiable;

    /**
     * 表名称
     * @var string
     */
    protected $table = 'shop';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        // 'username', 'email', 'password',
        'username' , 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * 获取会储存到 jwt 声明中的标识
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * 返回包含要添加到 jwt 声明中的自定义键值对数组
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return ['role' => 'shopadmin'];
    }
}
login.php#
代码已被折叠,点此展开
马江川 @13753441707
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

解决了,按文档说的,返回用户实例,为了省事我查询 使用了 db,粗心了,我以为只要是数据库查询结果 就可以了,当我改成使用集成 jwt 模型,并且完成文档所说的契约方法后,就可以了,附代码

    public function login()
    {

        // 注意,不能使用db
        $user = Shop::where('username','admin')->first();
        // 这里模型必须使用继承了Users类的查询实例
        $token = auth('shopadmin')->login($user);

        if ( !$token ) {
            return $this->fail( 50003 , '账号或者密码错误!' );
        }

        return $this->success( $this->respondWithToken($token) );
    }
4年前 评论
讨论数量: 13

@largezhou 老哥,因为这个登录指定了 jwt,报错提示 login 必须传入 jwt 实例,这个用户认证报错了,是我写的方法 有问题吗?

        $data = Db::table('shop')->where('username','admin')->first();

        // $credentials = request(['username', 'password']);
        $token = auth('shopadmin')->login($data);

        var_dump( $token );
4年前 评论

@mjc123456

问题很大,,,

如果要将已经存在的用户登入应用,可以调用 login 方法,并以用户实例作为其参数 。该对象必须实现 Illuminate\Contracts\Auth\Authenticatable 契约

你这个还得 结合 jwt 的文档

4年前 评论

为什么不把 openid 存下来

4年前 评论

@pigzzz openid 存下来了啊

4年前 评论

@mjc123456 那就直接用 openid 查找用户,用 fromUser 方法生成 token 就行了啊啊

4年前 评论

@pigzzz fromUser? 这这这,这是 jwt 的函数吗

4年前 评论

@largezhou
文档上也是这样写的

// 这个已经实现了契约的方法
use Illuminate\Foundation\Auth\User as Authenticatable;
// $data 是用户实例,然后调用,但报错了
auth('shopadmin')->login( $data );
报错内容

Argument 1 passed to Tymon\JWTAuth\JWTGuard::login() must be an instance of Tymon\JWTAuth\Contracts\JWTSubject, instance of stdClass given, called

file

4年前 评论
wanzi 4年前

解决了,按文档说的,返回用户实例,为了省事我查询 使用了 db,粗心了,我以为只要是数据库查询结果 就可以了,当我改成使用集成 jwt 模型,并且完成文档所说的契约方法后,就可以了,附代码

    public function login()
    {

        // 注意,不能使用db
        $user = Shop::where('username','admin')->first();
        // 这里模型必须使用继承了Users类的查询实例
        $token = auth('shopadmin')->login($user);

        if ( !$token ) {
            return $this->fail( 50003 , '账号或者密码错误!' );
        }

        return $this->success( $this->respondWithToken($token) );
    }
4年前 评论

@largezhou 谢谢了老哥,我这脑瓜子太笨了

4年前 评论
largezhou 4年前
mjc123456 (作者) (楼主) 4年前

@pigzzz 谢了老哥 ,解决了

4年前 评论

login 方法的写法不是线上的吧。。

4年前 评论

@php_yt 不是线上的,只是测试的,哈哈哈

4年前 评论