2016-10-21 11 views
3

私はDelphiでデスクトップアプリケーションを作成しており、Googleカレンダーと同期しようとしています(ウィンドウズのみ、勝利7以上)。私はシステムレジストリにカスタムURIスキーマを登録していますので、eu.myapp:testは私のプログラムを実行したり、すでに実行中のプログラムインスタンスにメッセージを渡したりします。カスタムURIスキーマを持つデスクトップアプリケーショントークンリクエストの "Missing scheme"

私は認証の最初のステップを手に入れました。既定のブラウザを開き、ユーザーにカレンダーを変更する権限があるかどうかを尋ね、認証コードをソフトウェアに戻します。

{ 
    "error": "invalid_request", 
    "error_description": "Invalid parameter value for redirect_uri: Missing scheme: eu.myapp", 
    "error_uri": "" 
} 

マイリクエストボディ:以下レスポンスボディで - OAuthクライアントは、私が実際にトークンを要求しようとすると、

はしかし、要求が(不正要求400を)拒否され、iOSアプリとして登録されています次のようになります。documentationによると

POST /oauth2/v4/token HTTP/1.1 
Host: www.googleapis.com 
Content-Type: application/x-www-form-urlencoded 

code=XXX& 
client_id=YYY& 
redirect_uri=eu.myapp& 
grant_type=authorization_code 

、私はURIがAPIコンソールから取得したリダイレクトを含めることになっていますが、私はそこには、そのようなURIを発見しました。古い回答がいくつか見つかりましたが、開発者コンソールは与えられてから変更されているように見えます。私は何が欠けていますか?

編集:いくつかのより多くの情報を追加しました 私は、単純なnodejsサーバを構築し、SSL証明書およびnginxのでそれを置くので、私は実際には全体で送信されるものを見ることができました。私はそれからトークンリクエストをそれに送信し、リクエストボディを監視するために、私のアプリケーションとサンプルのC#アプリケーションの両方を使用しました。 違いは唯一の違いは、delphiのurlが自動的にコードをエンコードしていることです(4%/ 2%の代わりに4%2Fhky ...など)。それ以外は全く同じように見えました。

私はまた、localhostポートを聞くようにアプリケーションを書き直そうとしましたが、結果は同じになりました。デルファイのデモでは、ユーザーがログインするための埋め込みブラウザを使用してgoogle apiを使用する方法を示していますが、apiのドキュメントによれば、そのAPIは廃止され、間もなく削除されます。また、最初のリダイレクトはうまく管理できるようですが、実際のトークンを取得するのは失敗します。

+0

デスクトップアプリケーションの場合は、ネイティブの資格情報またはその他を使用している必要があります。 iOSではありません。リダイレクトURIとしてurn:ietf:wg:oauth:2.0:oobを送信することができます。基本的には、ローカルホストを意味します。 – DaImTo

+0

これはGoogleがデスクトップアプリケーション向けに推奨している手法で、ループバックIPまたはカスタムURIスキーマです。実際には、デスクトップ上でスキーマアプローチを使用する場合は、クライアントタイプとしてiOSを選択する必要があります。 [デモ](https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthUniversalApp) – Oxudes

+0

https://developers.googleに従って、C#サンプルを現在動作させようとしています。 .com/youtube/analytics/registration_an_applicationインストールされたアプリケーションは、デスクトップコンピュータまたはハンドヘルドデバイス上で動作します。 Android、Chrome、iOS、およびその他のインストール済みアプリケーション用のOAuth 2.0資格情報を作成できます。個人的に私は他のタイプを好む。デモの著者に連絡して、彼らが喜んで手伝ってくれることを確かめてください。私はその前にそのようなものが多分助けになるとは思わなかった。C#のGoogle .Netクライアントライブラリを使用していないようです。だから、私のサンプルはあまり助けにならないでしょう。幸運 – DaImTo

答えて

0

私のエラーが見つかりました。私は、要求を行う責任があるDelphiコンポーネントによってパラメータが自動的にエンコードされていることに気付きました。私は手動でリダイレクトURIをトークン要求のパラメータとして設定する前にエンコードしました。コンポーネントはそれを再度エンコードし、コードリクエストで指定されたURLと異なることになり、uri_mismatchエラーが発生しました。

2番目のリクエストがリダイレクトされなくても、urlは検証パラメータとしてredirect_uriを使用しているため、両方のリクエストで同一である必要があります。

関連する問題