13

在 Laravel 5.4 中,使用 oauth2/passport,我有一个公开的路由 - 所以我不使用中间件身份验证。

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

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

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

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

并像这样返回:

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

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

4

3 回答 3

16

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

于 2017-02-23T18:25:19.277 回答
4

要通过令牌获取用户,您需要了解令牌是什么。

令牌分为三个 base64 编码部分:标头、有效负载和签名,以句点分隔。在你的情况下,因为你只是想找到用户,你只需要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);

有关 jwt 的更多信息。

于 2017-02-23T18:24:54.777 回答
0

尝试这个:

 $user = Auth::guard('users')->user();
 $name = $user->name;
于 2020-03-31T15:05:41.683 回答