如何使用 Wordpress Rest Api 获取当前登录用户?
Posted
技术标签:
【中文标题】如何使用 Wordpress Rest Api 获取当前登录用户?【英文标题】:How to get current logged in user using Wordpress Rest Api? 【发布时间】:2017-07-11 21:56:05 【问题描述】:我尝试添加自定义请求。
add_action('rest_api_init', function ()
register_rest_route( 'custom', '/login', array(
'methods' => 'GET',
'callback' => function(WP_REST_Request $request)
return wp_get_current_user();
));
);
但它总是返回 ID = 0 的用户; 我也试过这个:
add_action('rest_api_init', function ()
register_rest_route( 'custom', '/login', array(
'methods' => 'GET',
'callback' => function(WP_REST_Request $request)
return is_user_logged_in();
));
);
而且它总是返回 false。 但是用户肯定已经登录了。
我添加了我的自定义登录
add_action('rest_api_init', function ()
register_rest_route( 'custom', '/login', array(
'methods' => 'POST',
'callback' => function(WP_REST_Request $request)
$nonce = wp_create_nonce("wp_rest");
$user = wp_signon(array('user_login' => $_POST['username'],
'user_password' => $_POST['password'], "rememberme" => true), false);
if (is_wp_error($user))
return $user;
//do_action( 'wp_login', "capad" );
//$user['isloggedin'] = is_user_logged_in();
return array('user' => $user,
'nonce' => $nonce);
));
);
我添加“X-WP-Nonce”作为 http 请求的标头
现在每个请求都会输出:"code":"rest_cookie_invalid_nonce","message":"Cookie nonce is invalid","data":"status":403
【问题讨论】:
你搞定了吗?你能发布解决方案吗?谢谢 你修好了吗? 如果您正在使用第三方应用程序或独立应用程序,那么最好使用Application password
连接到 REST API,因为它现在内置在来自wordpress 5.6
的 wordpress 中。
【参考方案1】:
来自Authentication 章节,REST API 手册:
Cookie 身份验证是包含在其中的基本身份验证方法 WordPress。当您登录仪表板时,这会设置 cookie 对你来说正确,所以插件和主题开发者只需要有一个 登录用户。
但是,REST API 包含一种称为 nonces 的技术来避免 CSRF 问题。这可以防止其他网站强迫您执行操作 没有明确打算这样做。这个需要稍微特别 处理 API。
对于使用内置 javascript API 的开发人员,这是处理 自动为你。这是使用 API 的推荐方式 插件和主题。自定义数据模型可以扩展 wp.api.models.Base 以确保为任何自定义请求正确发送。
对于发出手动 Ajax 请求的开发人员,nonce 需要 通过每个请求。 API 使用随机数并将操作设置为
wp_rest
。然后可以通过_wpnonce
数据将这些传递给 API 参数(POST 数据或在 GET 请求的查询中),或通过X-WP-Nonce
标头。
这是一个 GET 示例:
https://example.tld/wp-json/wp/v2/users/me?_wpnonce=9467a0bf9c
或者在你的情况下:
https://example.tld/wp-json/custom/login/?_wpnonce=9463a0bf9c
nonce 是从哪里创建的
wp_create_nonce( 'wp_rest' );
所以您很可能在测试自定义端点时忘记了 nonce 部分。
希望对你有帮助!
【讨论】:
我尝试了您的解决方案并更新了我的帖子。你能帮忙吗? nonce 必须随客户端的请求一起提供,而不是在 rest-server 的响应中生成。例如,首先尝试使用客户端发送随机数的/wp-json/wp/v2/users/me/
端点并让它显示当前用户信息。 @SemyonTikhonenko
"API 使用随机数并将操作设置为 wp_rest
" 是的,我总是改变它,它把我搞砸了。【参考方案2】:
我花了两天时间寻找一种不添加插件的简单方法。
首先在你定义你的 api 的 function.php 中
//enqueue the script which will use the api
function api_callings_scripts()
wp_enqueue_script('score-script', get_template_directory_uri() . '/js/ScoreSaving.js', ['jquery'], NULL, TRUE);
// Pass nonce to JS.
wp_localize_script('score-script', 'ScoreSettings', [
'nonce' => wp_create_nonce('wp_rest'),
]);
add_action( 'wp_enqueue_scripts', 'api_callings_scripts' );
那么你的脚本 Ajax 调用云是这样的
jQuery.ajax(
type: "POST",
url: "/wp-json/score/update",
data: "var1":"value1",
beforeSend: function(xhr)
xhr.setRequestHeader('X-WP-Nonce', ScoreSettings.nonce);
,
success:
function( data )
console.log( data );
);
现在您可以在 API 代码中使用 get_current_user_id()
。
【讨论】:
我认为这解释了我的 get_current_user_id 问题。我在开发一个使用 React-native 作为前端和 axios 向 WP REST Api 发送请求的移动应用程序时遇到了问题。我没有使用 nonce,而是使用 JWT 进行身份验证,因为应用程序代码没有直接连接到 WP 应用程序。而且我看到处理 JWT 身份验证的插件没有登录用户。它只是检查令牌是否有效。 简单、高效、完美! 绝妙的解决方案!非常感谢。【参考方案3】:1. 安装并激活JWT Authentication for WP REST API plugin,同时安装WP REST API plugin 2. 现在您可以从移动应用程序或任何其他应用程序运行任何 wordpress 默认 api来源或邮递员。例如,从您的应用程序或邮递员中点击此网址。 https://example.com/wp-json/wp/v2/posts 3. 通过应用程序或邮递员,当您使用有效的详细信息(使用 rest api)登录时,您将获得一个令牌。要登录并获取令牌,请通过邮递员或应用程序运行以下 url https://example.com/wp-json/jwt-auth/v1/token 4. 这样你就会得到一个如图所示的token 现在使用这个令牌来获取登录用户的详细信息,例如5.在function.php中制作函数
function checkloggedinuser()
$currentuserid_fromjwt = get_current_user_id();
print_r($currentuserid_fromjwt);
exit;
add_action('rest_api_init', function ()
register_rest_route( 'testone', 'loggedinuser',array(
'methods' => 'POST',
'callback' => 'checkloggedinuser'
));
);
6. 现在再次在邮递员或应用程序中运行这个新 url 以获取登录用户详细信息。 https://example.com/wp-json/testone/loggedinuser(将 example.com 替换为您的网址) (https://i.stack.imgur.com/tIqhS.png)7. 同时根据 pt.wordpress.org/plugins/jwt-authentication-for-wp- 上的说明编辑您的 .htaccess 文件和 wp-config.php 文件rest-api
【讨论】:
...刚刚发生了什么? 我已经尝试了你的代码,我总是得到0
,当我应该返回用户ID时
@MarioBurga 查看此链接以在 .htaccess 文件和 wp-config 文件中添加代码。 pt.wordpress.org/plugins/jwt-authentication-for-wp-rest-api
@MarioBurga 如果您仍然遇到此代码的任何问题,请告诉我。
这在邮递员中为我解决了。使用 JWT 进行身份验证,使用返回的授权对其他请求进行身份验证。谢谢!【参考方案4】:
如果您更喜欢使用JWT Authentication for WP REST API,使用 Json Web Tokens 可能更容易实现。
首先您验证客户端发送 HTTP POST 请求到端点 /wp-json/jwt-auth/v1/token 发送 用户名 和 密码 字段以生成身份验证令牌。
成功的响应类似于:
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8",
"user_display_name": "admin",
"user_email": "admin@localhost.dev",
"user_nicename": "admin"
然后你传递令牌每个请求设置请求头 Authorization 比如:
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8
【讨论】:
如何获取当前用户表单访问令牌?有什么方法可以解码这个令牌,我会得到当前的用户ID? 插件处理授权,因此 wp_get_current_user 应该返回经过身份验证的用户。 @Gui 如何通过邮递员传递“授权”令牌?我应该在邮递员的键中写“不记名”吗?感谢您的帮助。 @shiv 你必须定义一个标题。为请求创建一个新标头并将其命名为 Authorization(这是标头的键)。 header 的值为 Bearer token-here【参考方案5】:这是另一种方式
$user_id = ""; //<- add this
add_action( 'rest_api_init', 'add_custom_users_api');
function add_custom_users_api()
$GLOBALS['user_id'] = get_current_user_id(); //<- add this
// route url: domain.com/wp-json/mmw/v1/testing
register_rest_route( 'mmw/v1', 'testing', array(
'methods' => 'GET',
'callback' => 'get_custom_users_data',
));
//Customize the callback to your liking
function get_custom_users_data()
return get_user_by( 'id', $GLOBALS['user_id'] ); //<- add this
【讨论】:
【参考方案6】:我正在处理 get_current_user_id() 将返回 0 的相同问题。经过一些测试,我发现只有在发送 POST 请求时才会出现这种情况。
对于 GET 请求,该函数返回登录的用户 ID,在 POST 请求中它返回 0。这可能是由于服务器配置造成的,因为这是在共享主机环境中。我之前没有找到任何帖子或 cmets 提到这一点,但这就是我的情况。一个简单的解决方法是在 GET 请求中将用户 ID 传递回前端,将其存储并在 POST 请求中作为额外参数发送。
【讨论】:
您可以将_wpnonce=<?php echo wp_create_nonce( 'wp_rest' ); ?>
传递给您的端点 URL,这似乎让 wp 对用户进行身份验证。在客户端发送用户 ID 是个坏主意,您可以将其传递给回调方法,同时注册安全的路由。以上是关于如何使用 Wordpress Rest Api 获取当前登录用户?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 WordPress REST API v2 搜索帖子?
Wordpress REST API:如何在 WP REST API JSON 文件中获取“纯文字”内容?
如何使用 WordPress REST api 返回某个月份的所有帖子
Wordpress 如何使用 python 和 REST API 获取高级自定义字段内容