gpt4 book ai didi

node.js - 如何在 session 中访问 token (Shopify 访问 token )

转载 作者:行者123 更新时间:2023-12-02 19:08:41 29 4
gpt4 key购买 nike

我主要从事前端工作,所以对 NodeJS 不是很熟悉。我正在开发一个 Shopify 自定义应用程序,该应用程序的目的是在下订单时它将接收 webhook 请求,并根据该请求将一些数据发送到其他 API(计费应用程序)

我使用shopify app cli构建了shopify应用程序,我的server.js文件如下所示;

import "@babel/polyfill";
import dotenv from "dotenv";
import "isomorphic-fetch";
import createShopifyAuth, { verifyRequest } from "@shopify/koa-shopify-auth";
import graphQLProxy, { ApiVersion } from "@shopify/koa-shopify-graphql-proxy";
import Koa from "koa";
import next from "next";
import Router from "koa-router";
import session from "koa-session";
const { receiveWebhook } = require("@shopify/koa-shopify-webhooks");
import * as handlers from "./handlers/index";
dotenv.config();
const port = parseInt(process.env.PORT, 10) || 8081;
const dev = process.env.NODE_ENV !== "production";
const app = next({
dev,
});
const handle = app.getRequestHandler();
const { SHOPIFY_API_SECRET, SHOPIFY_API_KEY, SCOPES } = process.env;
app.prepare().then(() => {
const server = new Koa();
const router = new Router();

server.use(
session(
{
sameSite: "none",
secure: true,
},
server
)
);
server.keys = [SHOPIFY_API_SECRET];
server.use(
createShopifyAuth({
apiKey: SHOPIFY_API_KEY,
secret: SHOPIFY_API_SECRET,
scopes: [SCOPES],

async afterAuth(ctx) {
//Auth token and shop available in session
//Redirect to shop upon auth
const { shop, accessToken } = ctx.session;
// This accessToken is what I need on other scope

ctx.cookies.set("shopOrigin", shop, {
httpOnly: false,
secure: true,
sameSite: "none",
});

// Register Webhook
handlers.registerWebhooks(
shop,
accessToken,
"ORDERS_PAID",
"/webhooks/orders/paid",
ApiVersion.October20
);

console.log(accessToken);

ctx.redirect("/");
},
})
);

const webhook = receiveWebhook({ secret: SHOPIFY_API_SECRET });
router.post("/webhooks/orders/paid", webhook, (ctx) => {
let user_id = ctx.state.webhook.payload.customer.id;

console.log("received webhook, user_id: ", user_id);

//console.log("ctx", ctx);

// I need that accessToken here to get some more info from Admin API with GraphQL
let accessToken = "???"

handlers
.graphqlRequest(
accessToken,
"https://my-store.myshopify.com/admin/api/2020-10/graphql.json",
`{
customer(id: "gid://shopify/Customer/${user_id}") {
email
metafields(first: 5) {
edges {
node {
key
value
}
}
}
}
}`
)
.then((res) => {
console.log("res => ", res);
})
.catch((err) => {
console.log("err => ", err);
});
});

server.use(
graphQLProxy({
version: ApiVersion.October20,
})
);
router.get("(.*)", verifyRequest(), async (ctx) => {
await handle(ctx.req, ctx.res);
ctx.respond = false;
ctx.res.statusCode = 200;
});
server.use(router.allowedMethods());
server.use(router.routes());
server.listen(port, () => {
console.log(`> Ready on http://localhost:${port}`);
});
});

createShopifyAuth() 方法使用我的应用程序 key 和应用程序 api key 获取 accessToken,我可以在 afterAuth() 方法中使用它,但我还需要在 router.post() 方法从 Shopify Admin API 获取更多信息。

根据 Shopify 文档(或我的理解),该 key 在 session 中可用,但我如何访问该 session 数据?或者我可以在 router.push() 中使用该 token 做什么?

最佳答案

仅为从管理面板登录应用程序的用户创建 session 。对于创建访问 token 的在线方法来说也是如此。

如果您通过 Webhook 请求(也称为不需要您在应用程序中重新登录的请求)请求访问 token ,您将无法访问 session ,也无法获取访问 token 。此外, session 有时会过期。

为了在 Webhook 请求中使用访问 token ,您需要创建一个无限期有效的离线访问 token 。 createShopifyAuth 有一个用于创建离线访问 token 的选项,您只需将 accessMode: 'offline' 添加到您的请求中(更多信息here)

示例:

createShopifyAuth({
apiKey: SHOPIFY_API_KEY,
secret: SHOPIFY_API_SECRET_KEY,
accessMode: 'offline',
scopes: ['read_products', 'read_orders'],

创建离线访问 token 后,您需要将其保存在数据库(或其他方式)中,并从 webhook 路由请求它,以便发出 graphql 请求。

这就是它的全部内容。

关于node.js - 如何在 session 中访问 token (Shopify 访问 token ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64669346/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com