不使用auth中间件,如何通过token获取用户id?

Without using auth middleware, how to get user id by token?

在 Laravel 5.4 中,使用 oauth2/passport,我的路由是 public - 所以我不使用中间件身份验证。

此路由由已登录和未登录的用户访问。

我想获取访问此路由的用户标识 o(如果已登录)。如果不通过参数或类似的方式传递用户 ID,是否可能(仅使用令牌)?

我可以通过以下方式获取用户令牌:

$access_token = $request->header('Authorization');

和return像这样:

"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjlmZGIwZGM0MzgyZjI4MzNjZTJkMzk5M2M2NzBmYWZiNWE3ZTdiODhhZGE4NWY0OTBhYmI5MGFjMjExODAyNzIwYTBmYzczOTJjM2YyZTdjIn0.eyJhdWQiOiIyIiwianRpIjoiOWZkYjBkYzQzODJmMjgzM2NlMmQzOTkzYzY3MGZhZmI1YTdlN2I4OGFkYTg1ZjQ5MGFiYjkwYWMyMTE4MDI3MjBhMGZjNzM5MmMzZjJlN2MiLCJpYXQiOjE0ODc4NTU2MTYsIm5iZiI6MTQ4Nzg1NTYxNiwiZXhwIjoxNDg3OTQyMDE2LCJzdWIiOiIxIiwic2NvcGVzIjpbIioiXX0.sdHNQ_bDGtO3lGBwtmlZfkSdYkaUsYSabaY93894Fw4l3z_wU5d7xsfNj6LoK8lPXBTFAhoFf7SjtuQ0F_T6lst0ADwEmc_fLTH1dsTkHq6BdOLr3Ur6dLrbYOqihHG0FhJ6HaUtanbRBBeuK33aVUwuUkCwVkrLgxK6OYEwcq97aU1Cuy3jHOfOB88VAuJ42kwtScpXzi0Oo6zlCxyGAmBlEMWdcSBEkI4vRR-cJdaWsRVZ--671i1Gw5jOhXtN0HS_HMNSf9WWgiUDAyhe1mvlW4eZbTDfg2Al34YauJ_rpPSCw6vwnvpqp9Yvh9Vl0r1k8o_bm_2-NjiVINqdRALmaORbFGu2S9CJso5Jcio_jrWSzznIkf6Jopw9ar8Ca_Cf_KV6cmLOOx2XgWXV7WMCkSIPQXFXrtxE4hnfXEd8K5S5HLgch0hPgJPpgL91x1i73MP1gQyYoWNFCip9cDDlDvPO1zG28O12c4H4bsdy1jaaOOOv34yECfgA87RIFCbGtrzd_9QBXDse51L1IFJu8B6sotyk_4QcGcKSWzOPjI8L2_xhPIG54qk0lzqNWeVHo2UbNpBB6u2OJnszKC44BH5hneYoTbqMGK_1Uo2jR14XixvBlZydXXquuTmDVoBj2ygfjlnZ6UWJenQIO_bLEkF2iaWcgbOhJ6S197k"

我不知道如何通过这个令牌定位用户。

要通过token获取用户,你需要了解token是什么

令牌分为三个 base64 编码部分:header、有效负载和签名,以句点分隔。在你的情况下,因为你只是想找到用户,你只需要 header

要获得 header,您可以这样做:

// break up the string to get just the token
$auth_header = explode(' ', $access_token);
$token = $auth_header[1];
// break up the token into its three parts
$token_parts = explode('.', $token);
$token_header = $token_parts[0];

// base64 decode to get a json string
$token_header_json = base64_decode($token_header);
// you'll get this with the provided token:
// {"typ":"JWT","alg":"RS256","jti":"9fdb0dc4382f2833ce2d3993c670fafb5a7e7b88ada85f490abb90ac211802720a0fc7392c3f2e7c"}

// then convert the json to an array
$token_header_array = json_decode($token_header_json, true);

有了这个之后,您可以在 jti 键中找到用户的令牌:

$user_token = $token_header_array['jti'];

你可以让用户使用它:

// find the user ID from the oauth access token table
// based on the token we just got
$user_id = DB::table('oauth_access_tokens')->where('id', $user_token)->value('user_id');

// then retrieve the user from it's primary key
$user = User::findOrFail($user_id);

More info on jwt's.

您不需要启用授权中间件。您可以使用 auth('api')->user() 来获取活跃用户。如果不存在令牌,它将为空。

试试这个:

 $user = Auth::guard('users')->user();
 $name = $user->name;