我需要检索连接到店面后端的客户,以不同的方式奖励他。
我创建了一个插件,扩展了插件系统的plugin.class
。
它使用路由store-api/account/customer
在商店api上获取客户,然后将其标识符发送到我的后端。我还用window.location.protocol
和window.location.hostname
解决了管理api的shop_url
…
这对我来说似乎不安全或不准确(域可以从销售渠道到管理api不同),我想知道是否有可能获取一个安全的唯一客户令牌,这将允许我解决shop_url
和客户的标识符。
我在文档中找不到任何可以帮助我保护应用程序的这一部分的内容。
谢谢。
(编辑)下面是我的实际代码,以获取客户内部的插件:
import Plugin from 'src/plugin-system/plugin.class';
import StoreApiClient from 'src/service/store-api-client.service';
const storeClient = new StoreApiClient();
const handleUser = (data, request) => {
let unsecuredUserId = null;
if (request.status === 200) {
try {
const user = JSON.parse(data);
unsecuredUserId = user.id || null;
} catch (e) {}
}
doSomethingWith(unsecuredUserId);
}
export default class SaylPlugin extends Plugin {
init() {
storeClient.get('store-api/account/customer', handleUser);
}
}
如果用户当前已登录,则可以访问twig模板中的customer对象。使用这个事实,你可以通过数据属性将客户数据传递给你的插件。插件库提供基于命名约定的选项自动解析。
{% set myPluginData = {
customerId: context.customer.id
} %}
<div data-my-custom-plugin="true"
data-my-custom-plugin-options="{{ myPluginData|json_encode }}">
</div>
class MyCustomPlugin extends Plugin {
init() {
if (this.options.customerId) {
// do something when the customer is logged in
}
}
// ...
}
PluginManager.register('MyCustomPlugin', MyCustomPlugin, '[data-my-custom-plugin]');
我终于找到了一个更安全的方法。
我的新插件代码:import Plugin from 'src/plugin-system/plugin.class';
import StoreApiClient from 'src/service/store-api-client.service';
const storeClient = new StoreApiClient();
const handleContext = (data, request) => {
if (request.status === 200) {
try {
const context = JSON.parse(data);
if (context instanceof Object) {
resolveCustomerBackendSide(
context.token,
context.salesChannel.id
);
}
} catch (e) {
console.error(e);
}
}
}
export default class SaylPlugin extends Plugin {
init() {
storeClient.get('store-api/context', handleContext);
}
}
在这个上下文中,我可以使用我在应用程序注册过程中保存的销售渠道标识符来解析管理api凭据后端(您必须允许在应用程序的清单中读取sales_channel)。因此,我获取销售渠道后端以检索sw-access-key
标头,并且我最终可以获取store-api后端以安全的方式检索客户(获取store-api/context
后获得的token
可以用作sw-context-token
标头)。