如何让oauth-1.0a与crypto适配WP-API?Ionic2调用报错求助
解决Ionic2中调用WP-API OAuth认证返回status 0的问题
首先,你碰到的status: 0和type: 3错误,在Ionic/Angular的Http请求场景里,大概率和请求未正常发送/被拦截或者跨域(CORS)限制有关,结合你用OAuth认证的情况,我们一步步排查解决:
1. 先检查Authorization头的格式是否正确
你给出的headers里Authorization字段明显格式有问题——OAuth 1.0a的Authorization头必须是完整的字符串,参数用逗号分隔,每个键值对都要用双引号包裹,正确格式应该是这样:
Authorization: OAuth oauth_consumer_key="你的密钥", oauth_nonce="jSZGPwkj4quRGMb0bh...", oauth_signature="xxx", oauth_signature_method="HMAC-SHA1", oauth_timestamp="123456789", oauth_version="1.0"
别手动拼接这个头!直接用oauth-1.0a库的toHeader()方法生成,它会帮你处理好格式:
const oauth = new OAuth({ consumer: { key: 'YOUR_CONSUMER_KEY', secret: 'YOUR_CONSUMER_SECRET' }, signature_method: 'HMAC-SHA1', hash_function(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } }); const requestData = { url: 'https://你的WP站点域名/wp-json/wp/v2/posts', method: 'GET' }; // 直接拿到正确格式的Authorization头 const authHeaders = oauth.toHeader(oauth.authorize(requestData));
2. 排查CORS跨域问题
Postman测试正常是因为它不受浏览器CORS策略限制,但Ionic在浏览器调试时(或Web端运行)会被浏览器的跨域规则拦截。WP-API这边需要配置CORS:
- 最简单的方式是安装激活
WP REST API CORS插件; - 也可以在主题的
functions.php里手动添加CORS头(生产环境建议把*换成你的Ionic应用域名):
add_action('rest_api_init', function () { remove_filter('rest_pre_serve_request', 'rest_send_cors_headers'); add_filter('rest_pre_serve_request', function ($value) { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Authorization, Content-Type'); return $value; }); }, 15);
如果真机测试正常、浏览器调试报错,那基本就是浏览器CORS限制导致的,用Ionic代理也能绕过:在ionic.config.json里添加代理配置:
{ "name": "你的应用名", "proxies": [ { "path": "/wp-json", "proxyUrl": "https://你的WP站点域名/wp-json" } ] }
之后请求URL改成/wp-json/wp/v2/posts,Ionic会帮你转发请求绕开CORS。
3. 规范Ionic Http模块的使用方式
在Ionic2里,要确保正确导入和使用Http模块,把oauth生成的头包装成Angular的Headers实例:
import { Http, Headers, RequestOptions } from '@angular/http'; // ... // 把oauth生成的头转成Angular Headers对象 const headers = new Headers(authHeaders); const requestOptions = new RequestOptions({ headers: headers }); this.http.get('https://你的WP站点域名/wp-json/wp/v2/posts', requestOptions) .subscribe( res => console.log('请求成功:', res), err => console.error('请求失败:', err) );
4. 检查URL和协议是否正确
- 确保请求URL是完整的(包含
http://或https://),不要省略协议; - 如果WP站点用了HTTPS,你的Ionic请求也必须用HTTPS,否则浏览器会拦截混合内容请求,导致
status:0。
内容的提问来源于stack exchange,提问作者Mazolo
相关产品推荐
相关产品推荐

