Ошибка Google Oauth: необходимо установить как минимум один клиентский секрет (Installed or Web)
Я использую Google Oauth 2.0 для загрузки видео на Youtube через наш сервер.
Мой идентификатор клиента - это "учетная запись службы". Я загрузил ключ json и добавил его в мое решение.
Вот соответствующий код:
private async Task Run(string filePath)
{
UserCredential credential;
var keyUrl = System.Web.HttpContext.Current.Server.MapPath("~/content/oauth_key.json");
using (var stream = new FileStream(keyUrl, FileMode.Open, FileAccess.Read))
{
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
// This OAuth 2.0 access scope allows an application to upload files to the
// authenticated user YouTube channel, but doesn't allow other types of access.
new[] { YouTubeService.Scope.YoutubeUpload },
"user",
CancellationToken.None
);
}
var youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
});
Когда я запустил его, я получаю эту ошибку: должен быть установлен хотя бы один клиентский секрет (Installed or Web).
Однако в моем json нет "секретности клиента":
{
"private_key_id": "9d98c06b3e730070806dcf8227578efd0ba9989b",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIICdQIBADANBgkqhk etc,
"client_email": "[email protected]account.com",
"client_id": "546239405652-8igo05a5m8cutggehk3rk3hspjfm3t04.apps.googleusercontent.com",
"type": "service_account"
}
поэтому я предполагаю, что я что-то забыл.
Может быть, я не могу использовать "служебную учетную запись"? не знаю...
Ответы
Ответ 1
Не эксперт на С#, но похоже, что вы пытались использовать учетную запись службы для потока веб-сервера OAuth2, что не должно работать.
Вероятно, вы захотите использовать ServiceAccountCredential.
Для получения дополнительной информации о различных потоках Google OAuth2 обратитесь к документу веб-сервер, учетная запись службы и т.д.
Ответ 2
Решение, использующее файл json
, довольно схож.
Вот пример, который создает VisionService
, используя GoogleCredential
объект, созданный из файла json
с ServiceAccountCredential
.
GoogleCredential credential;
using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(VisionService.Scope.CloudPlatform);
}
var service = new VisionService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "my-app-name",
});
для этого образца требуется два пакета NuGet
:
Google.Apis.Vision.v1
Google.Apis.Oauth2.v2
Ответ 3
Мне удалось получить учетную запись службы для работы с файлом P12, но хотелось бы знать, как использовать ее с файлом JSON, или просто значение из файла JSON для создания сертификата.
Чтобы получить токен
private static String GetOAuthCredentialViaP12Key()
{
const string serviceAccountEmail = SERVICE_ACCOUNT_EMAIL;
var certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable);
var scope = DriveService.Scope.Drive + " https://spreadsheets.google.com/feeds";
var credential = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { scope }
}.FromCertificate(certificate) );
if (credential.RequestAccessTokenAsync(CancellationToken.None).Result == false)
{
return null;
}
return credential.Token.AccessToken;
}
И вот как я использовал токен, который я получил
// Initialize the variables needed to make the request
OAuth2Parameters parameters = new OAuth2Parameters {AccessToken = token};
GOAuth2RequestFactory requestFactory = new GOAuth2RequestFactory(null, "MySpreadsheetIntegration-v1", parameters);
SpreadsheetsService service = new SpreadsheetsService("MySpreadsheetIntegration-v1");
service.RequestFactory = requestFactory;