【问题标题】:Requesting access token in DocuSign - Node.js在 DocuSign 中请求访问令牌 - Node.js
【发布时间】:2019-12-25 19:19:35
【问题描述】:

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

我错过了什么?

【问题讨论】:

  • 根据 stackoverflow 政策,请提出其他问题作为新问题。 StackOverflow 不是留言板。谢谢!
  • 欢迎来到 StackOverflow!请为所有有用的答案投票,包括对他人问题的回答。请务必检查/接受您自己问题的最佳答案!非常感谢....

标签: node.js docusignapi


【解决方案1】:

我对您的代码进行了视觉审查,并有几个 cmets:

可读性

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

通过 Fetch 发送表单数据

我认为您的具体问题是您没有正确发送表单数据。见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。它必须是一个新的 nonce 值——随机且不可猜测。

尝试/捕捉

您应该将 fetch 调用包装在 try/catch 块中。这将与 await 一起正常工作以捕获错误。

使用库

安全专家建议您在实施与安全相关的流程时使用库(库通常可用)。

对于 Node.js,passport 库非常流行,并且有一个用于 DocuSign 的 passport strategy。看到这个example 使用它。

查看 indexDSAuthCodeGrant 支持对象,它们获取用户名、帐户 ID、API 基本 URL 等。

【讨论】:

  • 谢谢拉里,我正在研究你的 git 示例。
  • 另一个问题:account-d.docusign.com/oauth/token 有时会返回包含同意/接受表单的“html 字符串”,如何将其显示给用户?我试过 res.writehead() 和 res.send() ;我不确定这是否是从该 API 获得的正确响应。
猜你喜欢
  • 2020-11-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多