6

Sencha Touch と PhoneGap を使用してモバイル アプリを作成しています。ユーザーが Google 資格情報を使用してアプリにログインできるようにしたいのですが、最初のリクエストで次のエラーが発生して壁にぶつかっています。

要求のリダイレクト URI: http://localhostが登録済みの URI と一致しませんでした。

私の Google API アカウントには、デフォルトで 2 つの URI が登録されています ( http://localhostと urn:ietf:wg:oauth:2.0:oob)。

私はこれらの両方を試しましたが、成功しませんでした。

送信するリクエストには、次のクエリ文字列パラメーターが含まれています。

基本的なプロセスは次のとおりです。

  • 上記のように URL を作成します
  • 新しいブラウザ ウィンドウを開く (ChildBrowser PhoneGap プラグインを使用)
  • URL に移動します
  • この時点で、Google のログイン ページが表示され、資格情報を入力できるようになります
  • ログインタップ後、上記のエラーを含むエラーページが表示されます。

これを iPhone シミュレーターと iPhone でテストしており、両方で同じ結果が得られています。アプリケーションはhttp://localhost URLでは実行されていないように見えますが、file:///var/mobile/Applications/<guid>/<app name>/www/index.html では実行されていますが、追加するオプションはありません。これはGoogleコンソールにあります(..またはありますか?:))

これが機能しない理由について何か提案はありますか? 私は OAuth と Google の API を使用した経験がほとんどないため、どんな小さなヒントでも大歓迎です!

前もって感謝します

スチュアート

4

3 に答える 3

8

OAuth2 を使用した Google APIの最良の出発点としてこれを読むことをお勧めします。あなたの場合、これが必要です: OAuth2 for Devices

おそらく、間違ったエンドポイントを使用してユーザー コードを要求している可能性があります。次のエンドポイントを使用する必要があります。

https://accounts.google.com/o/oauth2/device/code

これは curl を使用した例です (あなたの場合はGoogle+ APIへのアクセスを承認します):

curl https://accounts.google.com/o/oauth2/device/code -d "client_id=**your_client_id**" -d "scope=https://www.googleapis.com/auth/plus.me" -d "redirect_uri=urn:ietf:wg:oauth:2.0:oob"

次のような答えが得られます。

{
  "device_code" : "4/AToZcyQ7U1BTV-xu4LAqpw02SgIW",
  "user_code" : "bqsj67hb",
  "verification_url" : "http://www.google.com/device",
  "expires_in" : 1800,
  "interval" : 5
}

次に、アプリをユーザーのユーザー アカウントと「ペアリング」するためuser_codeとvalidation_url をユーザーに表示して、承認を求める必要があります。これまたはドキュメントからの良い例があります:

アプリケーションがユーザーにuser_codeとvalidation_url を表示した後、アプリケーションは、 user_codeとvalidation_urlで返された device_code を使用Google エンドポイントのポーリングを開始できます。ポーリングするエンドポイントの URL はhttps://accounts.google.com/o/oauth2/tokenで、リクエストの間隔は秒単位で指定されます。

最後のステップでは、curl を使用して access_token を要求します。

curl https://accounts.google.com/o/oauth2/token -d "client_id=**your_client_id**&client_secret=**your_client_secret**&code=**the _device_code_obtained_before**&grant_type=http://oauth.net/grant_type/device/1.0" 

次のような応答が返されます。

{
  "access_token" : "y23r9.AHES6ZT78qJl14pTueruthfh5676TYDF234-Eme33iQ",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "id_token" :  "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXVkIjoiNzgyMTM3OTUzMjkwLmFwcHMuZ29vZ2iLCJ0b2tlbl9oYXNoIjoiUUt0YmxTZUdsRUdNOVdPcUliRGR2QSIsImlhdCI6MTMzNDE3MDI1NywiZXhwIjoxMzM0MTc0MTU3fQ.Iz_Sv9X2fCydj4VfEdDxwWVH70DEK-rSzA5pWV9bvBdYB5VwgwFd8CSnotesDzJxq5pSKGwnAgvBfxSUbuGVmdET3E2sbrLODKymO9FoBzenfVooCwRXurzxvjKWF1EL3007lOPzTx9UGjqwShjjKQRoNjLFs-OmGCJsZGTHTGE",
  "refresh_token" : "1/gjgpKUyppp223s43HMerTX-zS_2JUxQOCk"
}

最後に、取得したaccess_tokenを使用して、許可したサービスにアクセスできます (API コンソールからアクセスを構成することを忘れないでください。この場合は Google+ API) 。

curl https://www.googleapis.com/plus/v1/people/me?access_token=y23r9.AHES6ZT78qJl14pTueruthfh5676TYDF234-Eme33iQ

の質問に関しては

「アプリケーションがhttp://localhost urlで実行されているようには見えません」。

答えはイエスです。これは予想される動作です。このredirect_uriは、アプリにパーミッションが正常に付与された後にコールバックする場所を示しています。あなたの場合、モバイルデバイス。

"urn:ietf:wg:oauth:2.0:oob"の場合、正確にはリダイレクトではありません。単にプロセスを続行するには、これを「キャッチ」または「フック」する必要あります

幸運を!

于 2012-04-11T20:18:30.020 に答える
2

私の答えはモバイルアプリに関するものではありませんが、他の人にとっては役立つかもしれません. redirect_url_mismatch があり、 Google Cloud Consoleでリダイレクト URL を編集して問題を修正しました 。URL は と完全に一致する必要があるため、 とは異なりますhttp://localhost:8080http://localhost:8080/

このリンクをブラウザーで開いてテストできました (あなたの に置き換えてくださいclient_id)。redirect_uriが間違っている場合、文句を言います。それが正しい場合、またはすでにアクセスを許可している場合は、にリダイレクトされlocalhost:8080ます。また、すでにアクセスを承認している場合は、ここで取り消すことができます。

于 2013-11-11T06:26:13.590 に答える
0

同様の問題があり、次のことを行いました。アプリをインストール済みアプリケーションではなく Web アプリケーションとして API コンソールに登録しました。したがって、http:// URL をリダイレクト URI として登録できます。Apache サーバー上のリダイレクト URL のページの本文は次のとおりです。

<? header("Location:myapp://authorize?code=".$_GET['code']); ?>

これにより、アプリは Facebook などの他の OAuth 承認済みサービスと実際に同じように動作します...

于 2012-06-04T22:42:53.823 に答える