私の非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_uri
がhttp://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_mismatch。 http://localhost:<some-random-port>/authorize
に戻るため、これはまだ受け入れられません。これは、私のWebアプリケーションの制御の範囲外です。
このコードを使用できます:(元のアイデア 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);
}
}
}
.NETアプリケーションの非Webサーバーアプリケーション、つまりC#コンソールアプリのコマンドラインプログラムでGoogleWebAuthorizationBroker.AuthorizeAsyncを使用しようとしている場合は、Google OAuthプロファイルを作成するときに重要です( https:// console。以下を選択するには、資格情報にdevelopers.google.com/apis )を入力します。これは非表示になっており、この方法で行わないと、ラジオボタン[その他]を選択した場合に承認プロセスを経る必要があります。 また、以下の手順で作成したJSONパラメーターの内容をコピーし、client_id/secretをWebアプリのバージョンに置き換えるだけでも失敗することに注意してください。 Google APIコンソール用の新しいOAuthクライアントプロファイルを作成します。
「ヘルプミー選択」をクリックしてください
目的のAPIライブラリを選択します。つまり(Google Calendar API)「ユーザーデータ」を選択します
「ええ-認証が必要なファイルはありません」つまりJavascriptとリダイレクトこれで、認証のないプロファイルができました
「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
作成中に「その他」を選択すると、oAuthクライアントIDは、リダイレクトの問題を解決するのに役立ちました(「Webアプリケーション」オプションがあると、ランダムなポートを持つURLにリダイレクトしようとしますが、これは非常に面倒です)
今私のGmailAPIは魅力のように機能します:)