Oauth 2.0 Google API服务不接受生成的JSON Web令牌

Oauth 2.0 Google API服务不接受生成的JSON Web令牌,oauth-2.0,google-cloud-platform,jwt,dialogflow-es,Oauth 2.0,Google Cloud Platform,Jwt,Dialogflow Es,我已经创建了一个服务帐户,并在谷歌云平台上下载了我的JSON凭证。我需要在.NET中对DialogFlow服务API进行REST POST调用。目前,我只能在PowerShell中使用生成的令牌来执行此操作。因为,我需要从脚本中完成这一切,所以我需要生成一个JWT,在REST调用中作为我的承载者传递。我的问题是,生成的JWT没有得到Google的尊重 我在PowerShell中得到了基于此的响应,并从中复制示例代码来创建我的JWT public static string GetSignedJw

我已经创建了一个服务帐户,并在谷歌云平台上下载了我的JSON凭证。我需要在.NET中对DialogFlow服务API进行REST POST调用。目前,我只能在PowerShell中使用生成的令牌来执行此操作。因为,我需要从脚本中完成这一切,所以我需要生成一个JWT,在REST调用中作为我的承载者传递。我的问题是,生成的JWT没有得到Google的尊重

我在PowerShell中得到了基于此的响应,并从中复制示例代码来创建我的JWT

public static string GetSignedJwt(string emailClient, string 
dialogueFlowServiceApi, string privateKeyId, string privateKey, string 
jsonPath)
{
    // to get unix time in seconds
    var unixTimeSeconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

    // start time of Unix system
    var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);

    // adding milliseconds to reach the current time, it will be used for issueAt time
    var nowDataTime = origin.AddSeconds(unixTimeSeconds);

    // one hour after the current time, it will be used for expiration time
    var oneHourFromNow = nowDataTime.AddSeconds(3600);

    // holder of signed json web token that we will return at the end
    var signedJwt = "";

    try
    {
        // create our payload for Jwt
        var payload = new Dictionary<string, object>
        {
            {"iss", emailClient},
            {"sub", emailClient},
            {"aud", dialogueFlowServiceApi},
            {"iat", nowDataTime},
            {"exp", oneHourFromNow}
        };

        // create our additional headers
        var extraHeaders = new Dictionary<string, object>
        {
            {"kid", privateKeyId}
        };

        IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
        IJsonSerializer serializer = new JsonNetSerializer();
        IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();

        IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);

        signedJwt = encoder.Encode(extraHeaders, payload, privateKey);
    }
    catch (Exception e)
    {
        Console.WriteLine(e);

        // return null if there has been any error
        return null;
    }
    finally
    {
        Console.WriteLine(signedJwt);
    }

    return signedJwt; 
}
除了正确的按键之外,我还使用了
https://dialogflow.googleapis.com/google.cloud.dialogflow.v2beta1.Intents
作为dialogFlow服务API密钥

我希望我生成的JWT能够被接受,但是它被谷歌拒绝了。

1)你使用了错误的算法

更改此代码行:

IJwtAlgorithm algorithm = new RS256Algorithm(null, key);
为此:

IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
2) 对于JWT标题:

var additional_headers = new Dictionary<string, object>
{
    { "kid", privateKeyId },
    { "alg", "RS256" },
    { "typ", "JWT" }
};
上面的授权URL:

string auth_url = "https://www.googleapis.com/oauth2/v4/token";
1) 您使用了错误的算法

更改此代码行:

IJwtAlgorithm algorithm = new RS256Algorithm(null, key);
为此:

IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
2) 对于JWT标题:

var additional_headers = new Dictionary<string, object>
{
    { "kid", privateKeyId },
    { "alg", "RS256" },
    { "typ", "JWT" }
};
上面的授权URL:

string auth_url = "https://www.googleapis.com/oauth2/v4/token";

我不能在标题中使用“alg”和“typ”。我得到一个错误:“已经添加了一个具有相同密钥的项。密钥:alg/typ”。然后AuthorizeToken()方法返回“远程服务器返回了一个错误:(400)错误请求”。此外,对于AuthorizeToken()方法,我尝试使用Json密钥中提供的URL:”和“”,但是,我收到了相同的错误请求(400)错误。您从哪里获取私钥?400错误请求意味着某些内容格式不正确、参数无效等。私钥需要来自Google服务帐户,而不是您手工创建的内容。当然。当我创建我的服务帐户时,已经下载了一个JSON.p12文件。我使用JSON文件中的私钥。使用相同的Json文件凭据,我可以在POSTMAN中通过授权并获得200条消息。问题显然是创建一个有效的JWT。我不能在标题中使用“alg”和“typ”。我得到一个错误:“已经添加了一个具有相同密钥的项。密钥:alg/typ”。然后AuthorizeToken()方法返回“远程服务器返回了一个错误:(400)错误请求”。此外,对于AuthorizeToken()方法,我尝试使用Json密钥中提供的URL:”和“”,但是,我收到了相同的错误请求(400)错误。您从哪里获取私钥?400错误请求意味着某些内容格式不正确、参数无效等。私钥需要来自Google服务帐户,而不是您手工创建的内容。当然。当我创建我的服务帐户时,已经下载了一个JSON.p12文件。我使用JSON文件中的私钥。使用相同的Json文件凭据,我可以在POSTMAN中通过授权并获得200条消息。问题显然是创建一个有效的JWT。