2

我正在构建一个移动应用程序,我想使用 wordpress.com api 从我的 wordpress.com 网站获取帖子。通常,您可以按照此处的说明进行操作:https ://developer.wordpress.com/docs/api/getting-started/ 。但是,在这种情况下,我尝试访问的 wordpress.com 站点设置为“私有”。

当我尝试发出 api 获取请求时,我收到 403 错误消息“用户无法访问此私人博客”。

是否可以使用 wordpress.com api 从私人 wordpress.com 博客加载帖子?

我希望当有人控制发出 api 请求的应用程序并控制目标私有站点(如这里的情况)时,这是可能的。这似乎是 api 的一个很好的用例。

我暂时不想更改该网站的私有状态。我也不希望应用程序的用户必须在任何地方输入登录凭据。我希望应用程序本身能够在加载帖子时提供相关凭据。

我经历了各种 oauth 操作,例如获取 client_id、client_secret_key 和令牌,但我没有看到任何实际从私人站点加载帖子的方法。

我已经看到之前提出的问题,没有答案,例如:https ://wordpress.stackexchange.com/questions/180637/fetching-private-posts-or-custom-post-types-via-wp-api-with-basic -身份验证如何使用 JSON rest api 从 wordpress 检索私人帖子?.

4

1 回答 1

2

我能够(大部分)弄清楚这一点。是的,绝对可以使用 wordpress.api 从私人 wordpress.com 站点加载帖子。

为此,您对私有站点进行的任何 api 调用(get、post 等)都需要在请求的标头中包含一个 oauth2 令牌。您从 wordpress.com 获得令牌。

请注意,此描述是关于 wordpress.com api,而不是 wordpress.org api。

要获取该令牌,您可以按照此处的步骤操作:https ://developer.wordpress.com/docs/oauth2/ 。您可能会获得需要定期刷新的短期令牌或永久令牌。您从服务器端代码方法获得永久令牌。

有几种不同的方法可以做到这一点:

所有这些都要求您在 wordpress.com 注册一个单独的 url,这里是:https ://developer.wordpress.com/apps/ 。在该站点上,您创建一个新的“应用程序”,该应用程序将请求许可。如果您有一个网站,该应用程序可以使用您的 url,或者只是您在开发中使用的 localhost 站点(或者如果您在开发中不使用它,甚至只是一个 localhost 端口 url - 关键是获取 client_id 并使用它在请求过程中)。在那里,您将获得这些步骤所需的 client_id 和 client_secret_code。从那里:

1)您可以只使用 curl 代码查询 api 并取回身份验证码,然后使用该身份验证码进行另一个查询以获取令牌。请注意,wordpress.com oauth2 文档中的 curl 代码是 PhP(不是纯 curl)。

2)您可以直接在您的应用程序中提供获取令牌的方法,如上面链接的 wordpress oauth2 文档中所述。对于离子应用程序,这可能需要使用 inappbrowser 插件,才能转到 api 应用程序授予您权限的页面。

3)另一种可能性:wordpress 设置了一个相当简单的基于节点的流程来获取令牌:转到https://github.com/Automattic/node-wpcom-oauth,在那里下载代码,然后按照步骤操作。一个非常有用的教程位于:http ://haiku2.com/2015/11/how-to-setup-a-wordpress-com-oauth-token/ 。它已经有几年了,但它现在仍然有效。

获得令牌后,将其包含在标头中以进行调用。例如,使用来自 @angular/common/http 的 HttpClient(对于 ionic/angular/typescript 应用程序):

var token = 'YOUR TOKEN'
var url = 'THE API ENDPOINT'
return new Promise((resolve) => {  
        let headers = new HttpHeaders();
        headers.append('Authorization', 'Bearer ' + token)
        this.http.get(url, {headers: headers}) 
        .subscribe(data => {
            console.log(data)
            }, err => {
            console.log(err);
        });
 });

这一切都应该工作......除非你遇到CORS(跨源)问题。

如果它似乎不起作用,或者如果您收到关于结果为空、令牌无效或不存在“Access-Control-Allow-Origin”标头的错误,则很有可能 CORS 是问题所在.

在 ionic 上——也许还有其他基于 Web 的工具——你可能需要配置你的设置以使用 wordpress.com 端点作为代理服务器。相关信息在这里:https ://blog.ionicframework.com/handling-cors-issues-in-ionic/ 。

对于 ionic 和 ios——当您想将应用程序放到设备或模拟器上时,由于 ionic 在 2017 年晚些时候实现了 WKWebView,因此在最近的 ionic 版本中存在一组单独的 CORS 问题。

以下是有关此的更多详细信息:https ://blog.ionicframework.com/wkwebview-for-all-a-new-webview-for-ionic/ 。要克服 ios 设备上的 CORS 问题,您必须绕过 CORS。Ionic 目前对此的建议是使用 Ionic Native http 插件。现在的实现似乎有点不一致,但这是我迄今为止看到的唯一解决方案。

于 2018-02-02T18:21:06.413 回答