我正在遵循此文档:https://account-d.docusign.com/oauth/token
我正在为回调API尝试以下操作:
router.get('/authGrantReturn', function(req, res){
let query = req.query;
console.log("code: " + req.query.code);
console.log("status: " + req.query.state);
console.log("in authGrantReturn");
return new Promise((resolve, reject)=>{
try{
let bodyData = {
grant_type: 'authorization_code',
code: req.query.code
};
console.log( "========code======")
console.log( req.query.code)
console.log( "========/code======")
let combination = `${integrationKey}:${secretKey}`;
let b64Combination = Buffer.from(combination).toString('base64');
console.log("combination "+ combination)
console.log("b64Combination "+ b64Combination)
fetch('https://account-d.docusign.com/oauth/token',{
method: 'POST',
headers: { 'Authorization': 'Basic ' + b64Combination,
'Content-Type': 'application/x-www-form-urlencoded' },
body: bodyData
})
/* fetch('https://account-d.docusign.com/oauth/token?grant_type:authorization_code&code='+b64Combination,{
method: 'GET',
headers: { 'Authorization': 'Basic ${b64Combination}', 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Encoding': 'gzip'}
}) */
.then(function (res) {
等...
上面是url调用的回调函数,看起来像这样:https://account-d.docusign.com/oauth/auth?response_type=code&scope=signature&client_id=7c2b8d7e-xxxx-xxxx-xxxx-cda8a50dd73f&state=a39fh23hnf23&redirect_uri=http://example.com/callback/
但是我收到“错误请求”,req.query.code是正确的,我不确定该组合。
我想念什么?
答案 0 :(得分:1)
我对您的代码进行了视觉检查,并有几点评论:
我建议您使用await而不是显式地处理promise对象。请注意,您的代码必须在async
函数中才能使用await,但这很容易做到。
我认为您的特定问题是您没有正确发送表单数据。参见this reference。
multipart/form-data
个请求。如果这不起作用,则可以通过URLSearchParams对象或显式创建表单数据。请参阅参考。未经测试的代码:
const bodyform = new FormData();
bodyform.append('grant_type', 'authorization_code');
bodyform.append('code', 'req.query.code');
console.log( "========code======")
console.log( req.query.code)
console.log( "========/code======")
let combination = `${integrationKey}:${secretKey}`;
let b64Combination = Buffer.from(combination).toString('base64');
console.log("combination "+ combination);
console.log("b64Combination "+ b64Combination);
let res = await fetch('https://account-d.docusign.com/oauth/token',{
method: 'POST',
headers: { 'Authorization': 'Basic ' + b64Combination },
body: bodyform
});
console.log( "========Results========"); console.log (res);
请务必检查您从DocuSign收到的state
值是否与将用户的浏览器重定向到DocuSign身份服务时发送的值相同。状态值prevents CSRF attacks。它必须是一个新的随机数值-随机且不可猜测。
您应该将fetch调用包装在try / catch块中。这将在等待错误的情况下正常工作。
安全专家建议您在实施与安全性相关的过程(通常都可以使用库)时使用库。
对于Node.js,passport库非常受欢迎,DocuSign有一个passport strategy。请参阅example的使用说明。
请参阅index和DSAuthCodeGrant支持对象,该对象获取用户名,帐户ID,API基本URL等。