0

ことが可能であるかどうかわからない:私は私のユーザーのためのより良い認証経験を提供するために、ネイティブ・クライアント・フローへのサーバーの流れを切り替えるしたいと思います。ネイティブのAndroid /アズールAppServiceと、Googleのログイン

問題は、ネイティブのログインがちょうどクライアントIDと秘密ではないと連携しながら、AzureのAppServiceは、「Webアプリケーション」のOAuthのセットアップを(クライアントIDや秘密が含まれています)が必要なことです。これは、電話でのログイン後、私はGoogleのトークンを持っているが、AppServiceはそれに何をするかを知らず、HTTP Unauthorizedを返すことを意味する。

モバイルクライアントSDKは私にAPIを提供しますが、それは、そのようなトークンでは動作しません。

var jObject = new JObject(
    new JProperty("access_token", auth.AccessToken), 
    new JProperty("id_token", auth.IdToken)); 

await ServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Google, jObject); 

独自のサーバー側のトークン検証を記述することなくこれを統合する適切な方法はありますか?

答えて

0

あなたはGoogle以外のAPIにアクセスしようとしているので、あなたはまだGoogleの中のWebアプリケーションを設定する必要があります。独自のネイティブログインでは不十分です。それでもIDと秘密とバックエンドを提供する必要があります意味

。クライアントは、サーバに送信されるIDトークンと認証コードを取得する責任があり、サーバーはGoogle documentationごとにアクセストークンの実際の取得を行います。

だからそれはあなたの呼び出しは実際には次のようになります意味:

var jObject = new JObject(
    new JProperty("authorization_code", auth.ServerAuthCode), // not sure what property your auth binding exposes this as 
    new JProperty("id_token", auth.IdToken)); 

await ServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Google, jObject); 

あり、エンドツーエンドのXamarin.Androidを使用するためのドキュメントはありませんが、オーバー一見にそれが役に立つかもしれませんApp Service iOS documentation for this scenario可動部分を見るだけです。あなたが続く一般的なパターンは次のとおりです。(あなたが前にやったとして)

  • はサーバーフローのためにすべてを設定し
  • GoogleはサインインSDK(あなたはすでにそれをやったように思える、あまりにも設定します)。

前述したように、あなたがに実行する可能性がある主な問題は、あなたが正しいAPIコンソールの登録を持っていることを確認しているコールを行います。使用しているWebアプリケーションクライアントIDにAndroidクライアントが接続されていることを確認する必要があります。 Google Sign-in for Android setup instructionsをすばやく表示することをおすすめします。また、認証コードは1回限りの使用であることに注意してください。また、ある時間内にGoogleが過剰に多くのリクエストを要求した場合、Googleがそのスロットルを使用するようになっています。あなたはdevの間にそれに遭遇するかもしれません。

0

私の知る限りでは、ネイティブクライアントの流れは、アクセストークンを取得するには、Googleのコードフローを使用しています。

このarticleによれば、Android、iOS、またはChromeアプリケーションでは、アクセストークンを取得するための秘密が必要ありません。

APIコンソールから取得したクライアントシークレット。この値は、Android、iOS、Chromeアプリケーションとして登録されたクライアントには必要ありません。

Azure App Serviceの認証/認可を有効にするためにバックエンドに設定しないと、Webアプリケーションのバックエンドはこのアクセストークンを承認しません。なぜなら、バックエンドはアクセストークンに従って認証トークンを返すために、独自のロジックを持っているからです(モバイルサーバーライブラリはアクセストークンに従ってロジックを書きます)。

モバイルアプリでクライアントフローを有効にする最も簡単な方法はバックエンドに設定されており、同じクライアントIDと秘密のAzure AppサービスのGoogle認証/認証を有効にすることができます。正しい秘密を設定すると、バックエンドはまだ認証トークンを返します)。ここで

はテスト画像です:あなたはまだアプリのGoogleの簡単な認証を有効にしたくない場合は

enter image description here

が、私はあなたがaccesstoeknをチェックするために、独自のロジックを含むカスタム認証を作成することができます示唆しますgoogleからユーザー情報を取得します。

チェックされた結果が成功し、十分な値を取得した場合、認証トークンを生成してクライアント側に戻すことができます。

モバイルアプリバックエンドでカスタム認証を作成する方法の詳細は、articleを参照してください。

+0

Holy Cow Brando、ClientIDにダミーシークレットを追加しました。私はここで2つの質問があります:偽のトークンを提出するAppServiceのセキュリティホールが見つかっただけですか?秘密が一致しない場合、AzureはそのトークンをGoogleの公開鍵インフラストラクチャに対して検証しますか? https://developers.google.com/identity/sign-in/web/backend-auth#verify-the-integrity-of-the-id-tokenをご覧ください。 また、私が使用したキーはAndroidアプリに限られています。つまり、私のアプリサービスは簡単な認証を使ってiOSクライアントをサーバーすることはできません。 –

+0

私の意見では、シークレットはサーバーフローを使用するときにアクセストークンを取得するために使用されます。クライアントフローを使用する場合は、最初にアクセストークンとidtokenを取得し、バックエンドに送信します。バックエンドはidtoken(jwtトークン)をデコードし、それには視聴者が含まれます。オーディエンスがGoogle appidと同じで、ユーザー情報がidtokenデータと等しい場合、authトークンがクライアントに返されます。 –

+0

同じappidを使用してiosとandroidでアクセストークンとIDトークンを取得すると、easy authは適切な認証トークンをクライアントに返すことができます。 –

関連する問題