Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为DocuSign API创建有效的JWT令牌_C#_Jwt_Docusignapi - Fatal编程技术网

C# 为DocuSign API创建有效的JWT令牌

C# 为DocuSign API创建有效的JWT令牌,c#,jwt,docusignapi,C#,Jwt,Docusignapi,尝试创建有效的jwt令牌 通过设置,我创建了一个RSA密钥对,并获得了私钥,但没有“----开始RSA私钥----------结束RSA私钥”----- " 我按照这里的说明进行操作,经过很多小时我创建了这个方法 public string Sign(string privateKey) { List<string> segments = new List<string>(); var header = new { alg

尝试创建有效的jwt令牌

通过设置,我创建了一个RSA密钥对,并获得了私钥,但没有“----开始RSA私钥----------结束RSA私钥”----- "

我按照这里的说明进行操作,经过很多小时我创建了这个方法

    public string Sign(string privateKey)
    {
        List<string> segments = new List<string>();

        var header = new { alg = "RS256", typ = "JWT" };

        //For production environments, use account.docusign.com
        var payload = new
        {
            iss = "4f489d61-dc8b------a828-3992e670dcbc",
            iat = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds,
            aud = "account-d.docusign.com",
            scope = "signature impersonation"
        };

        byte[] headerBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(header, Formatting.None));
        byte[] payloadBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload, Formatting.None));

        segments.Add(Base64UrlEncode(headerBytes));
        segments.Add(Base64UrlEncode(payloadBytes));

        string stringToSign = string.Join(".", segments.ToArray());

        byte[] bytesToSign = Encoding.UTF8.GetBytes(stringToSign);

        byte[] keyBytes = Convert.FromBase64String(privateKey);

        var privKeyObj = Asn1Object.FromByteArray(keyBytes);
        var privStruct = RsaPrivateKeyStructure.GetInstance((Asn1Sequence)privKeyObj);

        ISigner sig = SignerUtilities.GetSigner("SHA256withRSA");

        sig.Init(true, new RsaKeyParameters(true, privStruct.Modulus, privStruct.PrivateExponent));

        sig.BlockUpdate(bytesToSign, 0, bytesToSign.Length);
        byte[] signature = sig.GenerateSignature();

        segments.Add(Base64UrlEncode(signature));
        return string.Join(".", segments.ToArray());
    }

    private static string Base64UrlEncode(byte[] input)
    {
        var output = Convert.ToBase64String(input);
        output = output.Split('=')[0]; // Remove any trailing '='s
        output = output.Replace('+', '-'); // 62nd char of encoding
        output = output.Replace('/', '_'); // 63rd char of encoding
        return output;
    }
公共字符串符号(字符串私钥)
{
列表段=新列表();
var header=new{alg=“RS256”,typ=“JWT”};
//对于生产环境,请使用account.docusign.com
var有效载荷=新
{
iss=“4f489d61-dc8b------a828-3992e670dcbc”,
iat=(Int32)(DateTime.UtcNow.Subtract(新的DateTime(1970,1,1))).TotalSeconds,
aud=“account-d.docusign.com”,
scope=“签名模拟”
};
byte[]headerBytes=Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(header,Formatting.None));
byte[]payloadBytes=Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload,Formatting.None));
添加(Base64UrlEncode(headerBytes));
添加(Base64UrlEncode(payloadBytes));
string stringToSign=string.Join(“.”,segments.ToArray());
byte[]bytesToSign=Encoding.UTF8.GetBytes(stringToSign);
byte[]keyBytes=Convert.FromBase64String(privateKey);
var privKeyObj=Asn1Object.FromByteArray(keyBytes);
var privStruct=RsaPrivateKeyStructure.GetInstance((Asn1Sequence)privKeyObj);
ISigner sig=SignerUtilities.GetSigner(“SHA256withRSA”);
sig.Init(true,新的RsaKeyParameters(true,privStruct.modules,privStruct.PrivateExponent));
sig.BlockUpdate(bytesToSign,0,bytesToSign.Length);
byte[]signature=sig.GenerateSignature();
添加(Base64UrlEncode(签名));
返回字符串.Join(“.”,segments.ToArray());
}
专用静态字符串Base64UrlEncode(字节[]输入)
{
var输出=Convert.tobase64字符串(输入);
output=output.Split('=')[0];//删除任何尾随'='
output=output.Replace('+','-');//编码的第62个字符
output=output.Replace('/',''');//编码的第63个字符
返回输出;
}
当我在这个工具中检查JWT验证时,我得到了无效的签名错误


如何修复令牌??我无法继续执行步骤2获取访问令牌…

很抱歉您在JWT方面遇到问题。我建议您使用DocuSign C#SDK,而不是尝试编写自己的代码。 然后您可以在这里找到如何使用JWT的示例-。 与JWT相关的特定代码在这里-在
UpdateUserFromJWT()
方法下

JWT的常见问题:

  • 没有得到同意
  • 使用公共令牌而不是私有令牌
  • 使用畸形标记。令牌必须完全正确,包括提供的新行
  • 在请求中未使用正确的用户ID(GUID)
  • 未请求同意书中的“模拟”范围(上文第1条)

  • 谢谢我没有用户,我的服务调用api,因此我遵循应用程序身份验证授权场景。服务集成直接与DocuSign帐户集成,并且不会对每个最终用户进行身份验证。相反,使用此授权,应用程序本身被授予访问令牌,并代表自己发出请求。如何获得jwt令牌来验证我的应用程序?我尝试了SDK和RequestJWTUserToken方法,现在我获得了访问令牌!!!非常感谢。
        public string Sign(string privateKey)
        {
            List<string> segments = new List<string>();
    
            var header = new { alg = "RS256", typ = "JWT" };
    
            //For production environments, use account.docusign.com
            var payload = new
            {
                iss = "4f489d61-dc8b------a828-3992e670dcbc",
                iat = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds,
                aud = "account-d.docusign.com",
                scope = "signature impersonation"
            };
    
            byte[] headerBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(header, Formatting.None));
            byte[] payloadBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload, Formatting.None));
    
            segments.Add(Base64UrlEncode(headerBytes));
            segments.Add(Base64UrlEncode(payloadBytes));
    
            string stringToSign = string.Join(".", segments.ToArray());
    
            byte[] bytesToSign = Encoding.UTF8.GetBytes(stringToSign);
    
            byte[] keyBytes = Convert.FromBase64String(privateKey);
    
            var privKeyObj = Asn1Object.FromByteArray(keyBytes);
            var privStruct = RsaPrivateKeyStructure.GetInstance((Asn1Sequence)privKeyObj);
    
            ISigner sig = SignerUtilities.GetSigner("SHA256withRSA");
    
            sig.Init(true, new RsaKeyParameters(true, privStruct.Modulus, privStruct.PrivateExponent));
    
            sig.BlockUpdate(bytesToSign, 0, bytesToSign.Length);
            byte[] signature = sig.GenerateSignature();
    
            segments.Add(Base64UrlEncode(signature));
            return string.Join(".", segments.ToArray());
        }
    
        private static string Base64UrlEncode(byte[] input)
        {
            var output = Convert.ToBase64String(input);
            output = output.Split('=')[0]; // Remove any trailing '='s
            output = output.Replace('+', '-'); // 62nd char of encoding
            output = output.Replace('/', '_'); // 63rd char of encoding
            return output;
        }