2016-11-28 9 views
0

私はGoogle ID tokensを使用して、ユーザーを自分のWebサービスにサインインします。 Googleから受け取ったトークンの検証の一環として、Webサービスはトークンのペイロードにemail_verified = trueをチェックします。GoogleからのIDトークンでemail_verified = false

Gmail以外の、Google Apps以外のメールアドレスを使用しているユーザーの一部がsigned up for a Google-accountです。彼らは、サインアップ後にGoogleが送信した電子メールのリンクをクリックして、電子メールアドレスを確認しました。

これらのユーザーが自分のWebサービスにログインしようとすると、トークンのペイロードにemail_verified = falseが表示されます。

トークンの検証では、これはどういう意味ですか、これを無視する必要がありますか?

+0

あなたは何あなたはおそらくそれを無視しないべきではない、ユーザーが有効なアカウント/メールアドレスを持っていることを検証している場合。このログインはどのように達成していますか?私はそれを試していないが、email_verifiedがプロファイルスコープの一部として返され、問題のユーザーがGoogle+アカウントを持っていない場合、返信されるのか疑問に思う。 – DaImTo

+0

メールがユーザーによって確認された場合、その申し立てで真実を返す必要があります。私たちはこれを調べる必要があります。可能であれば、私のG +プロフィールを通じてユーザーのメールアドレスを私に送信できますか? – nvnagr

+0

@nvnagr私はG + – Rob

答えて

0

がありますが、サーバー側でIDトークンの整合性を検証することが可能な異なるwaysのカップル:

  1. 「手動」 - 常に、Googleの公開鍵をダウンロードし、署名を検証した後、一人ひとりフィールドは、issを含みます。主な利点(私の意見では小さなものですが)は、Googleに送信されるリクエストの数を最小限に抑えることができるということを見ています。
  2. は「自動的に」 - official oneのように - GoogleのAPIクライアントライブラリを使用して、このトークン https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
  3. を確認するために、GoogleのエンドポイントでGETを実行します。ここで

が、これがどのように見えるかです:

private const string GoogleApiTokenInfoUrl = "https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}"; 

public ProviderUserDetails GetUserDetails(string providerToken) 
{ 
    var httpClient = new MonitoredHttpClient(); 
    var requestUri = new Uri(string.Format(GoogleApiTokenInfoUrl, providerToken)); 

    HttpResponseMessage httpResponseMessage; 
    try 
    { 
     httpResponseMessage = httpClient.GetAsync(requestUri).Result; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 

    if (httpResponseMessage.StatusCode != HttpStatusCode.OK) 
    { 
     return null; 
    } 

    var response = httpResponseMessage.Content.ReadAsStringAsync().Result; 
    var googleApiTokenInfo = JsonConvert.DeserializeObject<GoogleApiTokenInfo>(response); 

    if (!SupportedClientsIds.Contains(googleApiTokenInfo.aud)) 
    { 
     Log.WarnFormat("Google API Token Info aud field ({0}) not containing the required client id", googleApiTokenInfo.aud); 
     return null; 
    } 

    return new ProviderUserDetails 
    { 
     Email = googleApiTokenInfo.email, 
     FirstName = googleApiTokenInfo.given_name, 
     LastName = googleApiTokenInfo.family_name, 
     Locale = googleApiTokenInfo.locale, 
     Name = googleApiTokenInfo.name, 
     ProviderUserId = googleApiTokenInfo.sub 
    }; 
} 
+0

で2つの例を送ってきましたが、私は第2の選択肢を認識していませんでした。私はその場で最初の選択肢を持っていた。しかし、これは問題には答えません.JWTのGoogleの問題でemail_verifiedがまだfalseであり、私がそれを受け入れるべきかどうかという疑問があります。 – Rob

+0

Alexandruこんにちは、tokeninfoエンドポイントはデバッグに役立ちます。 id_tokenは、サーバが遅れに追加するネットワークコールを行わずにサーバの検証を容易にするために作成されました。あなたの提案はセキュリティ上の問題を引き起こします。 idトークン検証の非常に重要な部分は、トークンがサーバー用であることを検証することです(オーディエンスフィールド)。 tokeninfoを呼び出すと、それが有効なid_tokenであることがわかりますが、視聴者を確認しない限り、セキュリティ上の問題が発生します。最良の選択肢は、ライブラリを使用することです。 tokeninfoエンドポイントを使用することは避けてください。 – nvnagr

+0

こんにちは@nvnagr、 'aud'フィールドの検証に関して、あなたがよく見れば、そのページでGoogleが明確に述べていることがわかります。また、私は提供されたコードサンプルでそれを行います。 –

関連する問題