bigcommerce - 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(结果相同)。
我在想我的商店管理员中可能有一些不正确的配置,但还没有发现任何需要更改的地方。
解决方案
我在 jwt.io 上解码了你的 JWT,我得到了这个:
标题:
{
"typ": "JWT",
"alg": "HS512"
}
这里至少有一个问题
根据文档,BC 需要 HS256 作为算法
https://developer.bigcommerce.com/api/v3/storefront.html#/introduction/customer-login-api
身体:
{
"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,或使您自己的时钟保持同步。
推荐阅读
- time-complexity - 给定输入大小 N**2 的 1 遍查找的时间复杂度
- swiftui - SwiftUI 2.0:关闭按钮不会关闭视图 - 如何让关闭按钮返回上一个视图?
- css - CSS Flexbox Wrap - 如何在大项目之前填充行
- visual-studio-code - 为什么自定义 VSCode 扩展可以在开发中工作,但在发布时却不行?
- php - 发生这种情况时,Laravel 事务不起作用
- python - Pycharm - ModuleNotFoundError
- python - 从 Pine 脚本到 Python 的递归函数
- sql - 在 Oracle 中从两个表中选择操作导致不完整的期望
- css - 如何将 css 添加到 Spring Boot 应用程序?
- python - 无法使用 openpyxl 打开单元格