web-dev-qa-db-ja.com

Google Oauthエラー:少なくとも1つのクライアントシークレット(インストール済みまたはWeb)を設定する必要があります

GoogleのOauth 2.0を使用して、サーバー経由でYouTubeに動画をアップロードしています。クライアントIDは「サービスアカウント」です。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's 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
            });

実行すると、次のエラーが発生します。少なくとも1つのクライアントシークレット(インストール済みまたはWeb)を設定する必要があります。

ただし、私のjsonには「クライアントシークレット」はありません。

{
  "private_key_id": "9d98c06b3e730070806dcf8227578efd0ba9989b",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIICdQIBADANBgkqhk etc,
  "client_email": "546239405652-8igo05a5m8cutggehk3rk3hspjfm3t04@developer.gserviceaccount.com",
  "client_id": "546239405652-8igo05a5m8cutggehk3rk3hspjfm3t04.apps.googleusercontent.com",
  "type": "service_account"
}

だから私は何かを見落としたと思います。 「サービスアカウント」が使えないのかな?わからない...

15
David

C#の専門家ではありませんが、サービスアカウントを使用してOAuth2 Webサーバーフローを実行しようとしていたようですが、機能しないはずです。代わりに ServiceAccountCredential を使用することをお勧めします。さまざまなGoogleOAuth2フローの詳細については、 ウェブサーバーサービスアカウント などのドキュメントを参照してください。

4
mengcheng

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",
});

このサンプルには、2つのNuGetパッケージが必要です。

Google.Apis.Vision.v1  
Google.Apis.Oauth2.v2
23
Sergey Tihon

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;
8
True Solutions