C# &引用;无效的IAP凭据:令牌上的Base64解码失败;在谷歌云[.NET]上访问API时
我正在尝试使用下面的代码获取访问令牌以验证Google服务帐户。此代码正在返回一个令牌。我尝试使用收到的令牌从Postman访问API,但得到的错误为“无效IAP凭据:令牌上的Base64解码失败:”。仅供参考,我正在使用 这是我收到的代币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
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;
}
}