如何使用 JWT 身份验证获取登录用户信息?

Posted

技术标签:

【中文标题】如何使用 JWT 身份验证获取登录用户信息?【英文标题】:How to get logged in user information using JWT Authentication? 【发布时间】:2019-08-31 16:45:51 【问题描述】:

在我的 WordPress REST API 项目中,我需要通过 api 登录用户数据。我使用JWT Authentication for WP REST API 插件来生成令牌。我已经使用用户的用户名和密码参数生成了令牌。

现在使用这个令牌,我在我的 api 文件中创建了一个函数,但它在邮递员中将 0 作为 api 响应发送给我,并在下面的标题中提供这些。

'Content-type': 'application/json', 
'Authorization': 'Bearer token_value'

功能代码:

function get_loggedin_user_info()
  global $current_user; 

  $current_user = wp_get_current_user();
  print_r($current_user);


add_action( 'rest_api_init', function () 
    register_rest_route( 'endpoints/v1', '/logininfo', array(
            'methods' => 'POST',
            'callback' => 'get_loggedin_user_info'
    ));
);

那么如何使用 WordPress 钩子 wp_get_current_user() 获取登录用户数据

其次,我怎样才能使jwt-auth/v1/token API 使用户名和密码成为动态的?

P.S 我已经在 htacceess 文件中添加了 RewriteCond 和 RewriteRule,并且还在我的配置文件中包含了 JWT Auth Secret 密钥。

define('JWT_AUTH_SECRET_KEY', 'secret-key');
define('JWT_AUTH_CORS_ENABLE', true);

【问题讨论】:

【参考方案1】:

你可以使用这条路线:/wp-json/wp/v2/users/me

将令牌发送到此路由并获取用户的详细信息

如果您有任何问题,我在这里 :)

【讨论】:

【参考方案2】:

请注意,您还可以在成功登录时修改 JWT 响应:

function mod_jwt_auth_token_before_dispatch( $data, $user ) 
    $user_info = get_user_by( 'email',  $user->data->user_email );
    $profile = array (
        'id' => $user_info->id,
        'user_first_name' => $user_info->first_name,
        'user_last_name' => $user_info->last_name,
        'user_email' => $user->data->user_email,
        'user_nicename' => $user->data->user_nicename,
        'user_display_name' => $user->data->display_name,
        'phone' => get_field( 'phone', "user_$user_info->id" ) // you also can get ACF fields
    );
    $response = array(
        'token' => $data['token'],
        'profile' => $profile
    );
    return $response;

add_filter( 'jwt_auth_token_before_dispatch', 'mod_jwt_auth_token_before_dispatch', 10, 2 );

这样,您无需调用另一个端点来从用户那里获取更多数据。

当用户返回您的站点/应用程序时,请记住首先验证令牌,然后调用/users/me 端点是一个好主意。

同样,如果你想返回users/me的更多信息,你可以这样做:

    function add_custom_fields() 
        register_rest_field(
            'user', 
            'profile',
            array(
                'get_callback'    => 'get_custom_fields',
                'update_callback' => null,
                'schema'          => null,
            )
        );
    
    add_action( 'rest_api_init', 'add_custom_fields' );

    function get_custom_fields( $object, $field_name, $request ) 
        $user_info = get_user_by( 'id',  $object['id'] );
        $profile = array (
            'id' => $user_info->id,
            'user_first_name' => $user_info->first_name,
            'user_last_name' => $user_info->last_name,
            'user_email' => $user_info->user_email,
            'user_nicename' => $user_info->user_nicename,
            'user_display_name' => $user_info->display_name,
        );
        return $profile;
    

【讨论】:

以上是关于如何使用 JWT 身份验证获取登录用户信息?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel,如何从自定义表的 jwt 令牌获取登录用户

如何使用基于 JWT 令牌的 express 获取经过身份验证的用户信息

如何从.Net Core API 中的身份验证 JWT 令牌中获取身份用户?

如何使用JWT进行身份验证与授权

如何使 Django REST JWT 身份验证与多个 Web 服务器一起扩展?

使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?