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
<?php

namespace App\Http\Controllers\ShopAdmin;

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Tymon\JWTAuth\Facades\JWTAuth;
use Illuminate\Support\Facades\Validator;

class LoginController extends Controller
{

    function __construct( )
    {
        $this->middleware('auth:shopadmin', ['except' => ['login']]);
    }

    public function login()
    {

        $credentials = request(['username', 'password']);
        $token = auth('shopadmin')->attempt($credentials);
        if ( !$token ) {
            return $this->fail( 50003 , '账号或者密码错误!' );
        }

        return $this->success( $this->respondWithToken($token) );
    }

    public function me()
    {
        return response()->json(auth('shopadmin')->user());
    }

    public function logout()
    {
        auth('shopadmin')->logout();
        return $this->success( '成功退出登录!Successfully logged out!' );
    }

    public function refresh()
    {   
        $data = $this->respondWithToken(auth('shopadmin')->refresh());
        return $this->success( $data );
    }

    /**
     * @param $token
     * @return JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth('shopadmin')->factory()->getTTL() * 1
        ]);
    }

}
马江川@13753441707
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前 评论

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