首页 > 解决方案 > BigCommerce StoreFront API SSO - 登录无效。请尝试重新登录

问题描述

在这住了几天。我正在我的 angular/nodejs 应用程序上制作登录表单。bc-api 能够验证用户/密码。现在,我需要允许客户使用 sso 进入商店,但生成的 jwt 不起作用。我在下面的尝试...我正在寻找故障排除技巧。

生成 JWT/sso_url

var jwt = require('jwt-simple');

function decode_utf8(s) {
  return decodeURIComponent(escape(s));
}

function get_token(req, data) {
    let uid = req.id;
    let time = Math.round((new Date()).getTime() / 1000);
    let  payload = {
        "iss": app.clientId,
        // "iat": Math.floor(new Date() / 1000),
        "iat": time,
        "jti": uid+"-"+time,
        "operation": "customer_login",
        "store_hash": app.storeHash,
        "customer_id": uid,
        "redirect_to": app.entry_url
    }
    let token = jwt.encode(payload, app.secret, 'HS512');
    token = decode_utf8(token);
    let sso_url = {sso_url: `${app.entry_url}/login/token/${token}`}
    return sso_url
}

payload解决为

{
    "iss": "hm6ntr11uikz****l3j2o662eurac9w",
    "iat": 1529512418,
    "jti": "1-1529512418",
    "operation": "customer_login",
    "store_hash": "2bihpr2wvz",
    "customer_id": "1",
    "redirect_to": "https://store-2bihpr2wvz.mybigcommerce.com"
}

生成sso_url

https://store-2bihpr2wvz.mybigcommerce.com/login/token/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJobTZudHIxMXVpa3oxMXpkbDNqMm82NjJldXJhYzl3IiwiaWF0IjoxNTI5NTEyNDE4LCJqdGkiOiIxLTE1Mjk1MTI0MTgiLCJvcGVyYXRpb24iOiJjdXN0b21lcl9sb2dpbiIsInN0b3JlX2hhc2giOiIyYmlocHIyd3Z6IiwiY3VzdG9tZXJfaWQiOiIxIiwicmVkaXJlY3RfdG8iOiJodHRwczovL3N0b3JlLTJiaWhwcjJ3dnoubXliaWdjb21tZXJjZS5jb20ifQ.vaeVTw4NjvX6AAPChgdXgMhm9b1W5B2QEwi4sJ6jz9KsKalqTqleijjRKs8jZP8jdQxC4ofYX5W0wYPMTquxQQ

结果

在此处输入图像描述

关于我的环境

我正在使用 nodejs express...我的 bc 应用程序的秘密和 clientId 正在上面使用,它们适用于其他几个 bc-api 任务。我的应用程序已在 bc admin 上安装和验证。用于执行上述操作的应用程序在 localhost 上运行,但我也尝试了在线 https(结果相同)。

我在想我的商店管理员中可能有一些不正确的配置,但还没有发现任何需要更改的地方。

标签: bigcommerce

解决方案


我在 jwt.io 上解码了你的 JWT,我得到了这个:

标题:

{
  "typ": "JWT",
  "alg": "HS512"
}

这里至少有一个问题

身体:

{
  "iss": "hm6ntr11uikz11zdl3j2o662eurac9w",
  "iat": 1529512418,
  "jti": "1-1529512418",
  "operation": "customer_login",
  "store_hash": "2bihpr2wvz",
  "customer_id": "1",
  "redirect_to": "https://store-2bihpr2wvz.mybigcommerce.com"
}

这里的问题:

  • JTI 应该是一个完全随机的字符串,使用包含时间的内容可能会导致重复,这将被拒绝。尝试使用 UUID
  • 客户 ID 应该是一个 int,而不是一个字符串
  • redirect_to 参数只接受相对 URL。因此,如果您的目标是重定向到主页,请尝试“redirect_to”:“/” 。
  • 另一个潜在的问题是系统时间——如果您的 JWT 是根据 BC 的服务器时间在“未来”创建的,那么您的 JWT 也将无法工作。您可以使用 /v2/time 端点响应来指定 IAT,或使您自己的时钟保持同步。

推荐阅读