我最近被分配的一个学校项目有一个编码挑战,我们必须完成。挑战包括多个部分,最后一部分是上传到私有GitHub存储库,并在一定条件下通过发出POST请求来提交完成请求。
我已经成功完成了挑战的其他部分,并且坚持提交请求。提交内容必须遵循以下规则:
建立您的解决方案要求
首先,构造一个JSON字符串,如下所示:
{
"github_url": "https://github.com/YOUR_ACCOUNT/GITHUB_REPOSITORY",
"contact_email": "YOUR_EMAIL"
}
在中填写
YOUR_EMAIL
您的解决方案的电子邮件地址和私有Github存储库YOUR_ACCOUNT/GITHUB_REPOSITORY
。然后,以JSON字符串作为主体部分,对以下URL发出HTTP POST请求。
CHALLENGE_URL
内容类型
请求的Content-Type:必须为
application/json
。授权书
该URL受HTTP基本认证的保护,这在RFC2617的第2章中进行了说明,因此您必须在POST请求中提供Authorization:标头字段。
- 对于HTTP基本身份验证的用户ID,请使用您在JSON字符串中输入的相同电子邮件地址。
- 对于密码,请提供一个符合RFC6238 TOTP的10位基于时间的一次性密码。
授权密码
要生成TOTP密码,您将需要使用以下设置:
- 您必须根据RFC6238生成正确的TOTP密码
- TOTP
Time Step X
是30秒。T0
是0。- 使用
HMAC-SHA-512
散列函数,而不是默认的HMAC-SHA-1
。- 令牌共享密钥是用户ID,后跟ASCII字符串值
"APICHALLENGE"
(不包括双引号)。共享的秘密例子
例如,如果userid为
"[email protected]"
,则令牌共享密钥为"[email protected]"
(不带引号)。如果您的POST请求成功,则服务器返回HTTP状态代码200。
我试图非常仔细地遵循此大纲,并以不同的方式测试我的工作。但是,看来我做不到。我们应该从节点服务器后端发出请求。到目前为止,这是我所做的。我使用以下代码创建了一个新的npm项目npm init
并安装了相关性,您将在下面的代码中看到这些相关性:
const axios = require('axios');
const base64 = require('base-64');
const utf8 = require('utf8');
const { totp } = require('otplib');
const reqJSON =
{
github_url: GITHUB_URL,
contact_email: MY_EMAIL
}
const stringData = JSON.stringify(reqJSON);
const URL = CHALLENGE_URL;
const sharedSecret = reqJSON.contact_email + "APICHALLENGE";
totp.options = { digits: 10, algorithm: "sha512" }
const myTotp = totp.generate(sharedSecret);
const isValid = totp.check(myTotp, sharedSecret);
console.log("Token Info:", {myTotp, isValid});
const authStringUTF = reqJSON.contact_email + ":" + myTotp;
const bytes = utf8.encode(authStringUTF);
const encoded = base64.encode(bytes);
const createReq = async () =>
{
try
{
// set the headers
const config = {
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic " + encoded
}
};
console.log("Making req", {URL, reqJSON, config});
const res = await axios.post(URL, stringData, config);
console.log(res.data);
}
catch (err)
{
console.error(err.response.data);
}
};
createReq();
据我了解,我不确定自己在哪里犯错。在理解要求时,我尝试要非常小心。我已经简要研究了挑战概述的所有文档,并收集了在给定条件下正确生成TOTP所需的必要要求。
我发现npm包otplib
可以通过传入的选项满足这些要求。
但是,我的解决方案不正确。当我尝试提交解决方案时,出现错误消息"Invalid token, wrong code"
。有人可以帮我看看我在做什么错吗?
我真的不希望我所有的辛苦工作都花光,因为这是一个漫长的项目。
提前非常感谢您的时间和帮助。我很感激。
软件包的自述文件otplib
指出:
// TOTP defaults
{
// ...includes all HOTP defaults
createHmacKey: totpCreateHmacKey,
epoch: Date.now(),
step: 30,
window: 0,
}
所以默认值epoch (T0)
就是Date.now()
它是RFC标准。任务描述定义T0
为0
。
您需要更改的默认值epoch
来0
:
totp.options = { digits: 10, algorithm: "sha512", epoch: 0 }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句