生成不带用户名和密码的JWT令牌

时间:2021-02-26 作者:FaISalBLiNK

我正在为使用插件登录我的网站的用户生成JWT令牌JWT Auth 该令牌将用于外部仪表板。

我面临的问题是,要生成JWT令牌,您需要传递usernamepasswordform-data/wp-json/jwt-auth/v1/token 端点,但存储在数据库中的密码是散列的,无法解密,那么解决方案是什么?我无法向端点发送纯文本密码。

期待您的建议。

2 个回复
最合适的回答,由SO网友:FaISalBLiNK 整理而成

对于面临类似问题的开发人员来说,这里是我为实现预期结果所做的工作。

最好的方法是从头开始开发功能,但由于时间紧迫,我选择修改JWT Auth Plugin

我修改了方法get_token 在文件中class-auth.php. 我所做的是,首先该方法是查找参数usernamepassword 我修改了它以接收userID 根据参数要求。为什么?userID ? 这是因为我正在运行cURL 在用户登录后调用以获取用户数据。以下是get_token 方法,如果有人想使用它。虽然这是一个小的修改,但它产生了所需的结果。谢谢大家的建议。快乐编码

public function get_token(WP_REST_Request $request)
    {
        $secret_key = defined(\'JWT_AUTH_SECRET_KEY\') ? JWT_AUTH_SECRET_KEY : false;

        $userID = $request->get_param(\'user_id\');
        $custom_auth = $request->get_param(\'custom_auth\');

        // First thing, check the secret key if not exist return a error.
        if (!$secret_key) {
            return new WP_REST_Response(
                array(
                    \'success\' => false,
                    \'statusCode\' => 403,
                    \'code\' => \'jwt_auth_bad_config\',
                    \'message\' => __(\'JWT is not configurated properly.\', \'jwt-auth\'),
                    \'data\' => array(),
                )
            );
        }

        // Getting data for the logged in user.
        $user = get_user_by(\'id\', $userID);

        // If the authentication is failed return error response.
        if (!$user) {
            // $error_code = $user->get_error_code();

            return new WP_REST_Response(
                array(
                    \'success\' => false,
                    \'statusCode\' => 403,
                    \'code\' => 404,
                    \'message\' => \'User does not exists.\',
                    \'data\' => array(),
                )
            );
        }

        return $this->generate_token($user, false);
    }

SO网友:Suhail

您可以使用custom\\u auth参数来处理这种情况

<小时/>

Edited

JWT有一个名为JWT\\u auth\\u custom\\u auth的过滤器,它将在收到包含“custom\\u auth”的负载时运行。您需要使用add\\u fitler函数挂接到该过滤器。请参阅下面的代码。

在我的例子中,第一块代码转到我的rest api自定义端点,在那里我使用它仅使用电子邮件地址登录/注册用户

第二个块是挂钩到过滤器,我选择把它放在我的插件文件中,但你也可以把它放在你的主题函数中。php文件

您可以在这个文件wp content\\plugins\\jwt auth\\class auth中看到逻辑。php第115行->;160

<小时/>


$_request = new WP_REST_Request( \'POST\', \'/jwt-auth/v1/token\' );
$_request->set_header( \'content-type\', \'application/json\' );
$_request->set_body(
    json_encode(
        [
            \'username\'    => $email,
            \'custom_auth\' => true,
        ]
    )
);
$response = rest_do_request( $_request );
return $response->data[\'data\'][\'token\']; // this will return a token
在你的功能中。php

add_filter(
    \'jwt_auth_do_custom_auth\',
    function ( $custom_auth_error, $username, $password, $custom_auth ) {
        if ( is_wp_error( $custom_auth_error ) ) {
            return null;
        }
        $user = get_user_by( \'email\', $username );
        return $user;
    },10,4);
我希望这有帮助

注:未测试