如何从 jwt 令牌获取确切的用户以及用户在 laravel 中的确切帖子

Posted

技术标签:

【中文标题】如何从 jwt 令牌获取确切的用户以及用户在 laravel 中的确切帖子【英文标题】:How can I get exact user plus the user's exact posts in laravel from jwt token 【发布时间】:2020-05-28 08:48:25 【问题描述】:

我试图通过将 jwt 发送到标题中来获取登录用户的详细信息,但我也想在另一个表中获取用户的详细信息。 我还想在另一个表中查看用户的详细信息以及用户的帖子。 这个函数

public function getAuthenticatedUser()

    try 

        if (! $user = JWTAuth::parseToken()->authenticate()) 
            return response()->json(['user_not_found'], 404);
        

     catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) 

        return response()->json(['token_expired'], $e->getStatusCode());

     catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) 

        return response()->json(['token_invalid'], $e->getStatusCode());

     catch (Tymon\JWTAuth\Exceptions\JWTException $e) 

        return response()->json(['token_absent'], $e->getStatusCode());

    

    // the token is valid and we have found the user via the sub claim

    $user = auth()->user();
    $userid = User::where('id', $user->id)->first();
    $return = UserResource::collection($userid);   
    return response()->json($return);



这是错误信息

<!--
BadMethodCallException: Call to undefined method App\User::mapInto() in file C:\xampp\htdocs\doc\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php on line 50

#0 C:\xampp\htdocs\doc\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php(36): Illuminate\Database\Eloquent\Model::throwBadMethodCallException('mapInto')
#1 C:\xampp\htdocs\doc\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(1620): Illuminate\Database\Eloquent\Model->forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), 'mapInto', Array)
#2 C:\xampp\htdocs\doc\vendor\laravel\framework\src\Illuminate\Http\Resources\CollectsResources.php(30): Illuminate\Database\Eloquent\Model->__call('mapInto', Array)
#3 C:\xampp\htdocs\doc\vendor\laravel\framework\src\Illuminate\Http\Resources\Json\ResourceCollection.php(52): Illuminate\Http\Resources\Json\ResourceCollection->collectResource(Object(App\User))
#4 C:\xampp\htdocs\doc\vendor\laravel\framework\src\Illuminate\Http\Resources\Json\AnonymousResourceCollection.php(25): Illuminate\Http\Resources\Json\ResourceCollection->__construct(Object(App\User))
#5 C:\xampp\htdocs\doc\vendor\laravel\framework\src\Illuminate\Http\Resources\Json\JsonResource.php(78): Illuminate\Http\Resources\Json\AnonymousResourceCollection->__construct(Object(App\User), 'App\\Http\\Resour...')
#6 C:\xampp\htdocs\doc\app\Http\Controllers\getUserController.php(67): Illuminate\Http\Resources\Json\JsonResource::collection(Object(App\User))
#7 [internal function]: App\Http\Controllers\getUserController->getAuthenticatedUser()
#8 C:\xampp\htdocs\doc\vendor\laravel\framework\src\Illuminate\Routing\Controller.php(54): call_user_func_array(Array, Array)

虽然这是 App\User(用户模型)

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Auth\Passwords\CanResetPassword;
use Auth;


class User extends Authenticatable implements MustVerifyEmail, JWTSubject

    use Notifiable;
    public function __construct()
        

            Auth::shouldUse('users');
        

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'phone', 'password', 'Age', 'Blood', 'Gender', 'Height', 'Weight', 'picture', 'history', 'record',
    ];

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

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function getJWTIdentifier()
    
        return $this->getKey();
    


    public function getJWTCustomClaims()
    
        return [];
    


    public function appointment()
        return $this->hasMany('App\Appointment');
    

什么是可能的解决方法?

【问题讨论】:

不知道你想做什么;为什么你有这个getAuthenticatedUser 函数,因为我猜这些检查已经在 Tymon JWT 的 auth 保护中了? 【参考方案1】:

看看the documentation关于资源集合。

您可以看到他们正在使用User::all()。另一方面,您正在使用User::where('id', $user-&gt;id)-&gt;first();。它们之间的区别是返回值。 all() 返回 Collectionfirst() 返回(在这种情况下)单个 User 实例。

您遇到的错误已经告诉您出了什么问题。 “调用未定义的方法 App\User::mapInto()”。它尝试在User 上调用mapInto。但是mapIntoCollection 的一个方法。

知道了这一点,我们可以根据您的需要做一些事情。

要返回多个用户吗?

UserResource::collection(User::all());

您要返回一位用户吗?

// You already have user from auth()->user(). No need to refetch it.
new UserResource(auth()->user());

对于添加用户的帖子,我建议您查看eager loading 的关系并将conditionally adding 与UserResource 联系起来。

在这种情况下不需要预先加载和有条件地添加关系,但我强烈建议您这样做,因为您可能还会使用 UserResource 来返回多个 User 实例。

【讨论】:

以上是关于如何从 jwt 令牌获取确切的用户以及用户在 laravel 中的确切帖子的主要内容,如果未能解决你的问题,请参考以下文章

如何从 jwt 令牌中获取用户 ID?

在哪里存储访问令牌以及如何跟踪用户(在 Http only cookie 中使用 JWT 令牌)

Laravel,如何从自定义表的 jwt 令牌获取登录用户

如何使用 jwt 令牌获取用户 ID

如何使用 jwt 令牌获取用户 ID

如何使用 JWT Bearer 令牌获取用户声明