如果不使用auth中间件,如何通过令牌获取用户ID?

时间:2017-02-23 17:54:16

标签: laravel laravel-5.4 laravel-passport

在Laravel 5.4中,使用oauth2 / passport,我有一条公共路线 - 所以我不会使用中间件身份验证。

登录但未登录的用户可以访问此路由。

我想获取正在访问此路由的用户ID o(如果已登录)。如果没有通过参数或类似的东西传递用户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"

我不知道如何通过此令牌找到用户。

3 个答案:

答案 0 :(得分:6)

您不需要启用身份验证中间件。您可以使用var Xval = document.getElementById('X').value; // or, optionally var Xval = document.getElementById('X').value.trim(); // removes extra white space if(Xval.length > 0 && Xval.length < 16){ // is not empty and less than 16 characters } 来获取活动用户。如果没有令牌,它将为null。

答案 1 :(得分:2)

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

令牌被分解为三个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);

More info on jwt's.

答案 2 :(得分:0)

尝试一下:

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