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

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

【问题讨论】:

    标签: laravel laravel-sanctum


    【解决方案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);
        }
      

      【讨论】:

        猜你喜欢
        • 2021-08-05
        • 2020-11-06
        • 2018-07-03
        • 2021-04-05
        • 2017-07-14
        • 2021-01-21
        • 2016-10-03
        • 2019-08-22
        • 2021-07-29
        相关资源
        最近更新 更多