Google Sheets API读取至WinForms报错:无法识别凭据类型
解决方案:修复Google Sheets API认证错误 "Unrecognized credential type"
错误原因
你遇到的问题核心是使用了错误类型的JSON密钥文件或错误的加载方式:
- 若下载的是OAuth 2.0客户端密钥(桌面应用类型,JSON含
"installed"字段),直接用GoogleCredential.FromStream()加载会失败——这个方法仅支持服务账号密钥或已授权的用户凭据(带刷新令牌的JSON)。 - 若下载的是服务账号密钥但JSON格式损坏/缺失关键字段,也会触发该错误。
方案1:使用服务账号认证(无需用户登录)
适合无需用户手动登录,直接访问共享给服务账号的表格场景:
步骤1:获取正确的服务账号密钥
- 回到Google Cloud Console,进入项目 → IAM与管理 → 服务账号
- 创建/选择服务账号,点击密钥 → 添加密钥 → 创建新密钥
- 选择JSON格式下载,该文件会包含
"type": "service_account"字段,这是FromStream能识别的凭据类型。
步骤2:共享表格给服务账号
打开目标Google Sheets,点击共享,输入服务账号JSON里的client_email值,赋予查看者权限。
步骤3:WinForms代码示例
using Google.Apis.Auth.OAuth2; using Google.Apis.Sheets.v4; using Google.Apis.Sheets.v4.Data; using Google.Apis.Services; using System.IO; using System.Windows.Forms; namespace GoogleSheetsWinForms { public partial class MainForm : Form { private static readonly string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly }; private const string SpreadsheetId = "你的表格ID"; // 从表格URL提取:https://docs.google.com/spreadsheets/d/[表格ID]/edit private const string Range = "表单响应1!A1:Z"; // 要读取的单元格范围 public MainForm() { InitializeComponent(); } private void btnLoadData_Click(object sender, EventArgs e) { try { using (var stream = new FileStream("service-account-key.json", FileMode.Open, FileAccess.Read)) { // 初始化服务账号凭据与Sheets服务 var credential = GoogleCredential.FromStream(stream).CreateScoped(Scopes); var service = new SheetsService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "WinForms Sheets Reader" }); // 调用API读取数据 var request = service.Spreadsheets.Values.Get(SpreadsheetId, Range); var response = request.Execute(); var values = response.Values; // 将数据展示到DataGridView if (values != null && values.Count > 0) { dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); // 添加表头 foreach (var header in values[0]) { dataGridView1.Columns.Add(header.ToString(), header.ToString()); } // 添加行数据 for (int i = 1; i < values.Count; i++) { dataGridView1.Rows.Add(values[i].ToArray()); } } else { MessageBox.Show("未找到数据"); } } } catch (Exception ex) { MessageBox.Show($"加载失败:{ex.Message}"); } } } }
方案2:使用OAuth 2.0认证(用户登录)
适合需要用户用自己的Google账号登录,访问个人Drive中表格的场景:
步骤1:确认OAuth客户端密钥
确保你下载的是OAuth 2.0客户端ID(桌面应用类型),JSON文件包含"installed"字段。
步骤2:WinForms代码示例
注意:WinForms中需用异步方法避免UI线程死锁:
using Google.Apis.Auth.OAuth2; using Google.Apis.Sheets.v4; using Google.Apis.Sheets.v4.Data; using Google.Apis.Services; using Google.Apis.Util.Store; using System.IO; using System.Windows.Forms; using System.Threading; namespace GoogleSheetsWinForms { public partial class MainForm : Form { private static readonly string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly }; private const string SpreadsheetId = "你的表格ID"; private const string Range = "表单响应1!A1:Z"; private const string ClientSecretJson = "client_secret.json"; // OAuth客户端密钥文件名 public MainForm() { InitializeComponent(); } private async void btnLoadData_Click(object sender, EventArgs e) { try { UserCredential credential; // 启动OAuth登录流程 using (var stream = new FileStream(ClientSecretJson, FileMode.Open, FileAccess.Read)) { string credPath = Path.Combine(Application.UserAppDataPath, "sheets.googleapis.com-winforms.json"); credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.FromStream(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)); } // 初始化Sheets服务 var service = new SheetsService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "WinForms Sheets Reader" }); // 读取并展示数据 var request = service.Spreadsheets.Values.Get(SpreadsheetId, Range); var response = await request.ExecuteAsync(); var values = response.Values; if (values != null && values.Count > 0) { dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); foreach (var header in values[0]) { dataGridView1.Columns.Add(header.ToString(), header.ToString()); } for (int i = 1; i < values.Count; i++) { dataGridView1.Rows.Add(values[i].ToArray()); } } else { MessageBox.Show("未找到数据"); } } catch (Exception ex) { MessageBox.Show($"加载失败:{ex.Message}"); } } } }
关键排查点
- JSON文件类型匹配:
- 服务账号密钥:含
"type": "service_account",用GoogleCredential.FromStream加载。 - OAuth客户端密钥:含
"installed",用GoogleWebAuthorizationBroker.AuthorizeAsync加载。
- 服务账号密钥:含
- 文件路径正确性:确保代码中引用的JSON文件路径正确,避免文件找不到或权限问题。
- 权限范围设置:根据需求选择
SpreadsheetsReadonly(只读)或Spreadsheets(读写)权限。
内容的提问来源于stack exchange,提问作者mifus arakiev
相关产品推荐
相关产品推荐

