jQuery Ajax基础认证仅外部可用,本地请求失效求解
WordPress REST API 本地请求权限问题解决
问题原因分析
你遇到的问题核心在于同域和跨域请求时WordPress REST API的认证机制差异:
- 在jsfiddle这类跨域环境中,浏览器无法自动携带WordPress的登录Cookie,所以WordPress会 fallback 到你代码里的HTTP Basic认证(
authorization头),只要服务器配置允许Basic Auth就能正常请求。 - 但在本地同域请求时,WordPress优先使用Cookie认证,不会识别你传的Basic Auth头。而你的请求没有提供WordPress REST API要求的非ce(nonce)令牌,所以被判定为无权限访问,返回401错误。修改
crossDomain参数不会改变这个认证逻辑,所以没用。
解决方案
你需要在AJAX请求的头中添加X-WP-NONCE字段,值通过WordPress内置的wp_create_nonce('wp_rest')函数生成,这个令牌是WordPress验证当前用户身份的关键。
更新后的完整代码示例:
var $ = jQuery; var makeBaseAuth = function(user, pswd){ var token = user + ":" + pswd; var hash = ""; if (btoa) { hash = btoa(token); } return "Basic " + hash; }; var settings = { "crossDomain": true, "url": "http://mywebsite.org/wp-json/wp/v2/settings", "method": "GET", "headers": { "authorization": makeBaseAuth("admin", "mypassword"), "X-WP-NONCE": "<?php echo wp_create_nonce( 'wp_rest' ); ?>" } } $.ajax(settings) .done(function(response){ console.log(response); }) .error(function(err){ console.log(err); });
注意:这段代码需要放在WordPress的模板文件(比如functions.php或者自定义页面模板)中,确保PHP代码能被正常解析执行,生成有效的nonce值。
内容的提问来源于stack exchange,提问作者neoDev
相关产品推荐
相关产品推荐

