Woocommerce API令牌访问级别

问题描述

我对Woocommerce rest-API和用户访问级别有一个一般性疑问。

我们开始基于Woocommerce-API开发客户android应用,并使用Woocommerce令牌(读/写)。

但是问题是令牌允许访问Woocommerce的全部信息/数据(所有客户订单,产品等),如果用户反编译APK并找到令牌,则他/她将访问Woocommerce的全部数据网站。

所以,问题是如何根据令牌中的用户角色来限制API的访问级别。

例如,客户级别令牌只能看到她自己的订单,产品,... 以及Woocommerce客户角色上定义的所有访问权限。

解决方法

全面披露,多年来没有触及WordPress。我在这里通常是在谈论API。

我认为您将需要构建访问控制列表和您自己的中间层API来完成此任务。我认为中间层可能是WordPress自己的API。

来自WooCommerce docs

此终结点专用于用户生成API密钥并促进WooCommerce REST API与应用程序之间的集成。绝不打算将此端点用作客户的登录方法。

基本上,我建议您使用代理层,在其中与所需的WooCommerce数据交换安全的用户API令牌,以验证用户可以在您的服务器上发出请求。

对于它的价值而言,这不必太费力:只需创建一个接受WooCommerce请求的端点,检查用户是否与客户匹配,然后将WooCommerce请求与正确的令牌发送给WooCommerce。取回响应,可以选择清理并返回数据(或数据的子集)。

从好的方面来说,如果您决定要在WooCommerce生态系统之外的其他地方使用某些数据,则可以使用中间层。

,

您可以构建具有自定义API端点的WP插件,其中该端点/插件将使用用户的凭据接收来自远程APK的API调用。

通过这种方式,读/写令牌保留在您的平台上,并且不会在任何APK中公开

当您从远程端收到特定操作时,您将在内部使用令牌仅限制将返回给该特定用户的内容,并再次检查其自己的登录凭据。

从某种意义上讲,这实现起来比较复杂,但是比向APK添加令牌要安全得多。

,

一个月前,我们公司遇到了完全相同的问题。经过大量搜索后,我们发现某个地方(找不到ATM链接),一个woocommerce工作人员说它是经过开发的,并且就是这种方式。

您不能只为某事而拥有令牌,要么全部拿走,要么就没有令牌。 令人讨厌的事情是,他们建议您开始包装他们所有api的端点,并根据需要保护他们。如果您问我,那只是浪费时间,而确实从Wooocommerce获得了工作/安全/经过测试的代码,您将浪费时间打包所有内容,从而在将来更新端点策略时会导致错误。 >

在我们的案例中,由于只需要几件事,我们决定使用安全逻辑而不是wc auth来创建一个全新的终结点。

另一个不好的事情是,只有当用户实际上拥有一个Wordpress帐户时,您才能获得该令牌,并且您可以打开请求用户访问+表示确认的方式(例如,当您将第三方应用与FB / Google连接在一起时) )

在我们的案例中,移动应用需要获取一些WC数据,而无需用户拥有一个帐户,这似乎是当前WC Rest API不可能完成的任务。

,

为什么不为每个用户生成新的API密钥?

WooCommerece文档指出,您可以使用/wc-auth/v1/authorize端点为拥有的每个用户生成一个API密钥。

来自documentation

任何应用程序均可使用此端点,以允许用户为您的APP生成API密钥。这使与WooCommerce API的集成更加容易,因为用户仅需要通过URL授予对您的APP的访问权限。重定向回您的APP后,API密钥将在单独的POST请求中发送回去。

这是如何构建身份验证URL的python示例:

from urllib.parse import urlencode

store_url = 'http://example.com'
endpoint = '/wc-auth/v1/authorize'   # Here is the endpoint I mentioned!
params = {
    "app_name": "My App Name","scope": "read_write","user_id": 123,"return_url": "http://app.com/return-page","callback_url": "https://app.com/callback-endpoint"
}
query_string = urlencode(params)

print("%s%s?%s" % (store_url,endpoint,query_string))

这是使用API​​密钥发布的JSON的示例

{
    "key_id": 1,"consumer_key": "ck_xxxxxxxxxxxxxxxx","consumer_secret": "cs_xxxxxxxxxxxxxxxx","key_permissions": "read_write"
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...