首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在会话中访问令牌(Shopify访问令牌)

如何在会话中访问令牌(Shopify访问令牌)
EN

Stack Overflow用户
提问于 2020-11-03 19:28:27
回答 1查看 5.3K关注 0票数 2

我主要是在前端工作,所以我对NodeJS不太熟悉。我正在开发一个Shopify自定义应用程序,这个应用程序的目的是在下订单时接收web钩子请求,并通过该请求将一些数据发送给其他API (计费应用程序)。

我用shopify应用程序cli构建了shopify应用程序,我的server.js文件是这样的;

代码语言:javascript
复制
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()方法使用我的应用程序机密和app密钥获得一个accessToken,我可以在afterAuth()方法中使用它,但我也需要在router.post()方法中使用这个令牌,以便从Shopify Admin获得更多信息。

根据Shopify文档(或我所理解的),会话中可以使用该密钥,但如何访问该会话数据?或者在router.push()中可以使用什么令牌?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-03 20:52:53

会话只为从管理面板登录应用程序的用户创建。对于创建访问令牌的联机方法来说,这是正确的。

如果您从web钩子请求(也就是一个不需要您在应用程序中重新登录的请求)请求访问令牌,那么您将无法访问会话,也无法获得访问令牌。此外,会议在某个时候到期。

为了在web钩子请求中使用访问令牌,您需要创建一个无限期有效的offline访问令牌。createShopifyAuth有一个创建离线访问令牌的选项,您只需将accessMode: 'offline'添加到请求中(详细介绍此这里)。

示例:

代码语言:javascript
复制
createShopifyAuth({
      apiKey: SHOPIFY_API_KEY,
      secret: SHOPIFY_API_SECRET_KEY,
      accessMode: 'offline',
      scopes: ['read_products', 'read_orders'],

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

差不多就是这么回事。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64669346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档