C# &引用;无效的IAP凭据:令牌上的Base64解码失败;在谷歌云[.NET]上访问API时

C# &引用;无效的IAP凭据:令牌上的Base64解码失败;在谷歌云[.NET]上访问API时,c#,oauth-2.0,jwt,google-oauth,service-accounts,C#,Oauth 2.0,Jwt,Google Oauth,Service Accounts,我正在尝试使用下面的代码获取访问令牌以验证Google服务帐户。此代码正在返回一个令牌。我尝试使用收到的令牌从Postman访问API,但得到的错误为“无效IAP凭据:令牌上的Base64解码失败:”。仅供参考,我正在使用 这是我收到的代币 ya29.c.Ko4B4Act579buZYyeoPgvOwuKREoi981lSLUQxA03SzAPGQuPY9Z3CXSnkouFdO4wj1lRwhGJxCLlnLlVsmLBySYf1VWQIbtSf8wMbIzW5b7n6mXeQgb-xk8SX

我正在尝试使用下面的代码获取访问令牌以验证Google服务帐户。此代码正在返回一个令牌。我尝试使用收到的令牌从Postman访问API,但得到的错误为“无效IAP凭据:令牌上的Base64解码失败:”。仅供参考,我正在使用

这是我收到的代币

ya29.c.Ko4B4Act579buZYyeoPgvOwuKREoi981lSLUQxA03SzAPGQuPY9Z3CXSnkouFdO4wj1lRwhGJxCLlnLlVsmLBySYf1VWQIbtSf8wMbIzW5b7n6mXeQgb-xk8SXwNZsLqxHprGlj-Zr35YrvoBzQPE6_OEQSD7g90g3Y-3DDnkCqs1m_K-udBVIVVYJ3lDQ
代码

公共类GoogleServiceAccount
{
/// 
///从JSON密钥异步获取访问令牌
/// 
///JSON密钥文件的路径
///访问令牌中需要的作用域
///作为字符串任务访问令牌
公共静态异步任务GetAccessTokenFromJSONKeyAsync(字符串jsonKeyFilePath,参数字符串[]范围)
{
使用(var stream=newfilestream(jsonKeyFilePath,FileMode.Open,FileAccess.Read))
{
返回等待谷歌认证
.FromStream(stream)//加载密钥文件
.CreateScoped(范围)//收集请求的范围
.underlineCredential//获取凭据
.GetAccessTokenForRequestAsync(“https://accounts.google.com/o/oauth2/auth“”;//获取访问令牌
}
}
/// 
///从JSON密钥获取访问令牌
/// 
///JSON密钥文件的路径
///访问令牌中需要的作用域
///以字符串形式访问令牌
公共静态字符串GetAccessTokenFromJSONKey(字符串jsonKeyFilePath,参数字符串[]作用域)
{
返回GetAccessTokenFromJSONKeyAsync(jsonKeyFilePath,scopes);
}
}

我使用了不正确的方式获取令牌。通过IAP的确切方式如下所述。

IAP要求您(这是一个JWT),而不是使用访问令牌。我几个小时前刚做过,发现它很管用。谢谢你的更新。
class Program
{
    public const string SCOPE_READONLY = "https://www.googleapis.com/auth/userinfo.profile";
    public const string KEYFILE_PATH_READONLY = @"../../keys/XXXjson";
    public const string CLIENT_EMAIL_READONLY = "YYY@XXX.iam.gserviceaccount.com";
    static void Main(string[] args)
    {
        var token = GoogleServiceAccount.GetAccessTokenFromJSONKey(
        KEYFILE_PATH_READONLY,
        SCOPE_READONLY);

        Console.WriteLine(token);
    }  
}
public class GoogleServiceAccount
    {
        /// <summary>
        /// Get Access Token From JSON Key Async
        /// </summary>
        /// <param name="jsonKeyFilePath">Path to your JSON Key file</param>
        /// <param name="scopes">Scopes required in access token</param>
        /// <returns>Access token as string Task</returns>
        public static async Task<string> GetAccessTokenFromJSONKeyAsync(string jsonKeyFilePath, params string[] scopes)
        {
            using (var stream = new FileStream(jsonKeyFilePath, FileMode.Open, FileAccess.Read))
            {
                return await GoogleCredential
                    .FromStream(stream) // Loads key file
                    .CreateScoped(scopes) // Gathers scopes requested
                    .UnderlyingCredential // Gets the credentials
                    .GetAccessTokenForRequestAsync("https://accounts.google.com/o/oauth2/auth"); // Gets the Access Token
            }
        }

        /// <summary>
        /// Get Access Token From JSON Key
        /// </summary>
        /// <param name="jsonKeyFilePath">Path to your JSON Key file</param>
        /// <param name="scopes">Scopes required in access token</param>
        /// <returns>Access token as string</returns>
        public static string GetAccessTokenFromJSONKey(string jsonKeyFilePath, params string[] scopes)
        {
            return GetAccessTokenFromJSONKeyAsync(jsonKeyFilePath, scopes).Result;
        }

    }