如何在 Sanctum Laravel 中通过 Token 获取用户

Posted

技术标签:

【中文标题】如何在 Sanctum Laravel 中通过 Token 获取用户【英文标题】:How to get user by Token in Sanctum Laravel 【发布时间】:2021-05-06 09:28:36 【问题描述】:

我在 POST 请求正文中将用户的令牌传递给服务器。我需要找出这个令牌属于哪个用户。在 laravel/sanctum 文档中,我发现只有将 Token 作为 "Authorization": "Bearer ****" 标头才能做到这一点。但这不是我的情况,我需要在 POST 正文中传递它。有办法吗?

【问题讨论】:

【参考方案1】:

我做了一些实验并阅读了 Sanctum 的源代码,找到了解决方案。用户的数据可以通过 POST 数据中的 token 获取:

$post_data = $request->all();
if (isset($post_data['user_token'])) 
    [$id, $user_token] = explode('|', $post_data['user_token'], 2);
    $token_data = DB::table('personal_access_tokens')->where('token', hash('sha256', $partner_token))->first();
    $user_id = $user_id->tokenable_id; // !!!THIS ID WE CAN USE TO GET DATA OF YOUR USER!!!

【讨论】:

【参考方案2】:

我做了以下事情:

我的登录控制器

class LoginController extends Controller

    use ApiResponser;

    public function __invoke(Request $request)
    
        // attempting login
        if(!auth()->attempt($request->only('email', 'password'))) 
            return $this->error(401, 'Credentials not match' );
        

        // Delete old tokens
        auth()->user()->tokens()->delete();

        // Succesfull login and new token created.
        return $this->success([
            'token' => auth()->user()->createToken('API Token', auth()->user()->abilities())->plainTextToken
        ]);
    

所以你清楚地知道我接下来在我的 ApiResponser 中所做的只是为了漂亮的状态消息。

namespace App\Traits;


use Illuminate\Http\JsonResponse;

trait ApiResponser

    /**
     * Returns a succesfull response
     * @param $data
     * @param string|null $message
     * @param int $code
     * @return JsonResponse
     */
    protected function success($data, string $message = null, int $code = 200): JsonResponse
    
        return response()->json([
            'status' => 'Success',
            'message' => $message,
            'data' => $data
        ], $code);
    

    /**
     * Return an error JSON response.
     *
     * @param  string  $message
     * @param  int  $code
     * @param  array|string|null  $data
     * @return JsonResponse
     */
    protected function error( int $code, string $message = null, $data = null): JsonResponse
    
        return response()->json([
            'status' => 'Error',
            'message' => $message,
            'data' => $data
        ], $code);
    


我收到以下 json


    "status": "Success",
    "message": null,
    "data": 
        "token": "156|mmEL7OV24DO79W5E6IdAXiQaHa8BCXK6271hLE3m"
    

我有一个 nuxtJS 项目,在我的登录组件中我有以下内容

  methods: 
    login(e) 
      e.preventDefault()
      this.$auth
        .loginWith('laravelSanctum', 
          data: this.form,
        )
        .then((resp) => 
          this.$auth.strategy.token.set(resp.data.data.token)
          this.$axios.setToken(resp.data.data.token, 'Bearer')
        )
        .catch((e) => 
          // eslint-disable-next-line no-console
          console.log('Failed Logging In')
        )
    ,
  ,

最后在我的 VueX 用户存储中

export const actions = 
  async fetchAllUsers(state, payload = false) 
    state.commit('SET_BUSY', true)
    this.$axios.setToken(this.$auth.strategy.token.get(), 'Bearer')
    const response = await this.$axios('users', 
      headers,
      params: payload,
    )
    console.log(response.data)
    state.commit('GET_USERS', response.data.data.data)
    state.commit('SET_SEARCH', response.data.data.search)
    state.commit('SET_FILTERS', response.data.data.filters)
    state.commit('SET_BUSY', false)
  ,
  async createUser(state, payload) 
    this.$axios.setToken(this.$auth.strategy.token.get(), 'Bearer')
    const response = await this.$axios.post('user', payload, 
      headers,
    )
    state.commit('ADD_USER', response.data.data)
    return response
  ,

【讨论】:

感谢您的回答,但这并不是我所需要的。 是从标头获取令牌的问题还是找到具有令牌的用户 因为你是用token发帖的。 auth()->user 已经是属于令牌的用户【参考方案3】:
  if($request->has('token'))

         [$id, $token] = explode('|', $request->input('token'), 2);
         $token_data = DB::table('personal_access_tokens')->where('token', hash('sha256', $token))->first();
         
         dd($token_data);
  

【讨论】:

以上是关于如何在 Sanctum Laravel 中通过 Token 获取用户的主要内容,如果未能解决你的问题,请参考以下文章

419 页面使用 laravel sanctum 过期

如何使用 CSRF 令牌测试 Laravel / Sanctum 端点

如何在没有典型 laravel /login 的情况下使用 laravel sanctum

如何使用 Laravel Sanctum 和 React 修复 401 Unauthorized 错误?

如何在 LARAVEL_7 中通过迁移发送多个复选框

如何在laravel中通过id选择不同表上的关系数据