在DocuSign中请求访问令牌-Node.js

时间:2019-12-25 19:19:35

标签: node.js docusignapi

我正在遵循此文档: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是正确的,我不确定该组合。

我想念什么?

1 个答案:

答案 0 :(得分:1)

我对您的代码进行了视觉检查,并有几点评论:

可读性

我建议您使用await而不是显式地处理promise对象。请注意,您的代码必须在async函数中才能使用await,但这很容易做到。

通过提取发送表单数据

我认为您的特定问题是您没有正确发送表单数据。参见this reference

注意:以下代码使用FormData对象。它总是创建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的使用说明。

请参阅indexDSAuthCodeGrant支持对象,该对象获取用户名,帐户ID,API基本URL等。