web-dev-qa-db-ja.com

GoogleWebAuthorizationBroker.AuthorizeAsyncにreturn_uriを設定するにはどうすればよいですか?

私の非MVC .NET WebアプリケーションGoogle Calendar API を使用しようとしています。 (これは重要な違いのようです。)

私はGoogleで この例 とDaimtoで この例 のコードをいくつかの ここに関連する投稿

私は次のメソッドを書きました:

public void GetUserCredential( String userName )
{
    String clientId = ConfigurationManager.AppSettings[ "Google.ClientId" ];            //From Google Developer console https://console.developers.google.com
    String clientSecret = ConfigurationManager.AppSettings[ "Google.ClientSecret" ];    //From Google Developer console https://console.developers.google.com
    String[] scopes = new string[] {
            Google.Apis.Calendar.v3.CalendarService.Scope.Calendar          
    };

    // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData%
    UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync( new ClientSecrets
    {
        ClientId = clientId,
        ClientSecret = clientSecret             
    }, scopes, userName, CancellationToken.None, new FileDataStore( "c:\\temp" ) ).Result;

    // TODO: Replace FileDataStore with DatabaseDataStore
}

問題は、GoogleのOAuth2ページが呼び出されると、redirect_urihttp://localhost:<some-random-port>/authorizeに設定され続けることです。 AuthorizeAsyncによって生成された次のURLの例のように、これを他の何かに設定する方法がわかりません。

https://accounts.google.com/o/oauth2/auth?access_type=offline
    &response_type=code
    &client_id=********.apps.googleusercontent.com
    &redirect_uri=http:%2F%2Flocalhost:40839%2Fauthorize%2F
    &scope=https:%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar

Googleは、redirect_uri_mismatchエラーページで次のメッセージで応答します。

「リクエストのリダイレクトURI: http:// localhost:XXXXX/authorize / 登録されたリダイレクトURIと一致しませんでした」

GoogleDeveloperのコンソール認証情報ページに登録できるリダイレクトURIは非常に多くなります。 65535ポートを登録したくないので、自分のサイトで/authorize以外のページを使用したいと思います。具体的には、開発中にhttp://localhost:888/Pages/GoogleApiRedirectを使用したいのですが、開発者コンソールで行ったこと以外に、これをどこに設定するかについての手がかりがありません。

redirect_uriの値を明示的に設定するにはどうすればよいですか?また、「このアプローチは完全に間違っています」という形での回答も受け付けています。

編集:

過去1日間これを試してみたところ、WebアプリケーションではなくネイティブアプリケーションのクライアントID /クライアントシークレットを使用することで、少なくともGoogleのWeb認証ページにredirect_uri_mismatchhttp://localhost:<some-random-port>/authorizeに戻るため、これはまだ受け入れられません。これは、私のWebアプリケーションの制御の範囲外です。

17
Bob Kaufman

このコードを使用できます:(元のアイデア http://coderissues.com/questions/27512300/how-to-append-login-hint-usergmail-com-to-googlewebauthorizationbroker

dsAuthorizationBroker.RedirectUri = "my localhost redirect uri";
UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync(...

dsAuthorizationBroker.cs

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Requests;
using Google.Apis.Util.Store;

namespace OAuth2
{    
    public class dsAuthorizationBroker : GoogleWebAuthorizationBroker
    {
        public static string RedirectUri;

        public new static async Task<UserCredential> AuthorizeAsync(
            ClientSecrets clientSecrets,
            IEnumerable<string> scopes,
            string user,
            CancellationToken taskCancellationToken,
            IDataStore dataStore = null)
        {
            var initializer = new GoogleAuthorizationCodeFlow.Initializer
            {
                ClientSecrets = clientSecrets,
            };
            return await AuthorizeAsyncCore(initializer, scopes, user,
                taskCancellationToken, dataStore).ConfigureAwait(false);
        }

        private static async Task<UserCredential> AuthorizeAsyncCore(
            GoogleAuthorizationCodeFlow.Initializer initializer,
            IEnumerable<string> scopes,
            string user,
            CancellationToken taskCancellationToken,
            IDataStore dataStore)
        {
            initializer.Scopes = scopes;
            initializer.DataStore = dataStore ?? new FileDataStore(Folder);
            var flow = new dsAuthorizationCodeFlow(initializer);
            return await new AuthorizationCodeInstalledApp(flow, 
                new LocalServerCodeReceiver())
                .AuthorizeAsync(user, taskCancellationToken).ConfigureAwait(false);
        }
    }


    public class dsAuthorizationCodeFlow : GoogleAuthorizationCodeFlow
    {
        public dsAuthorizationCodeFlow(Initializer initializer)
            : base(initializer) { }

        public override AuthorizationCodeRequestUrl
                       CreateAuthorizationCodeRequest(string redirectUri)
        {
            return base.CreateAuthorizationCodeRequest(dsAuthorizationBroker.RedirectUri);
        }
    }    
}
22
Cristian

.NETアプリケーションの非Webサーバーアプリケーション、つまりC#コンソールアプリのコマンドラインプログラムでGoogleWebAuthorizationBroker.AuthorizeAsyncを使用しようとしている場合は、Google OAuthプロファイルを作成するときに重要です( https:// console。以下を選択するには、資格情報にdevelopers.google.com/apis )を入力します。これは非表示になっており、この方法で行わないと、ラジオボタン[その他]を選択した場合に承認プロセスを経る必要があります。 また、以下の手順で作成したJSONパラメーターの内容をコピーし、client_id/secretをWebアプリのバージョンに置き換えるだけでも失敗することに注意してください。 Google APIコンソール用の新しいOAuthクライアントプロファイルを作成します。

「ヘルプミー選択」をクリックしてください

Step 1

目的のAPIライブラリを選択します。つまり(Google Calendar API)「ユーザーデータ」を選択します

Step 2

「ええ-認証が必要なファイルはありません」つまりJavascriptとリダイレクトこれで、認証のないプロファイルができました

enter image description here

「JSONのダウンロード」を使用してアプリケーションに保存し、以下のコードで参照します。このファイルの内部を見ると、これがアプリケーションであることをブローカーに伝えるためのさまざまなパラメーターのセットにも気付くでしょう。この例では、スコープCalendarAPIにアクセスしています。アクセスしようとしているAPIにスコープを変更するだけです。

   string[] Scopes = { CalendarService.Scope.Calendar }; //requires full scope to get ACL list..
                string ApplicationName = "Name Of Your Application In Authorization Screen";

                //just reference the namespaces in your using block

                using (var stream = new FileStream("other_client_id.json", FileMode.Open, FileAccess.Read))
                {
                    // The file token.json stores the user's access and refresh tokens, and is created
                    // automatically when the authorization flow completes for the first time.
                    string credPath = "other_token.json";
                    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(stream).Secrets,
                        Scopes,
                        "user",
                        CancellationToken.None,
                        new FileDataStore(credPath, true)).Result;               
                }

                // Create Google Calendar API service.
                var service = new CalendarService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = ApplicationName,
                });

                //Then your ready to grab data from here using the methods mentioned in Google Calendar API docs
6
moto_geek

作成中に「その他」を選択すると、oAuthクライアントIDは、リダイレクトの問題を解決するのに役立ちました(「Webアプリケーション」オプションがあると、ランダムなポートを持つURLにリダイレクトしようとしますが、これは非常に面倒です)

今私のGmailAPIは魅力のように機能します:)

0
Venkat pv