2017-08-24 14 views
1

Ok ...私は現在ASP.NET Core Identity 1.1.2でASP.Net Core 1.1.2を使用しています。ASP.Net Core Identityを使用してログインしたユーザーからGoogleプロフィール写真を取得するにはどうすればよいですか?

Startup.csにおける重要な部分は、次のようになります。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     //... 
     app.UseGoogleAuthentication(new GoogleOptions 
     { 
      AuthenticationScheme = "Google", 
      SignInScheme = "Identity.External", // this is the name of the cookie middleware registered by UseIdentity() 
      ClientId = Configuration["ExternalLoginProviders:Google:ClientId"], 
      ClientSecret = Configuration["ExternalLoginProviders:Google:ClientSecret"] 
     }); 
    } 

GoogleOptionsはMicrosoft.AspNetCore.Authentication.Google nugetパッケージが付属しています。

AccountController.csでコールバック関数は次のようになります。

だから、
[HttpGet] 
    [AllowAnonymous] 
    public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null) 
    { 
     //... SignInManager<User> _signInManager; declared before 
     ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync(); 
     SignInResult signInResult = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false); 
     string email = info.Principal.FindFirstValue(ClaimTypes.Email); 
     string firstName = info.Principal.FindFirstValue(ClaimTypes.GivenName); 
     string lastName = info.Principal.FindFirstValue(ClaimTypes.Surname); 
     // 
    } 

、すべてはこの時点までは正常に動作します。そしてここで私は立ち往生している。私はaccesstokensとpictureUrlと呼ばれる主張について多くの記事を読んでいます。しかし、プリンシパルにはそれらのどれも含まれていません。

質問は次のとおりです。ExternalLoginCallback関数でプロファイルイメージを一度取得する方法は?

答えて

1

私はクレームから写真のURLを取得する方法が見つかりませんでした。最後に、クレームに付属のnameidentifierを使用したソリューションを見つけました。

必要なものはすべてGoogle APIキーです。

  1. ゴーGoogleのAPIコンソールへ:APIキーを作成するには

  2. プロジェクトのドロップダウンから、プロジェクトを選択するか、新しいプロジェクトを作成します。
  3. Google+ APIサービスを有効にします。

    a。 Google APIのリストで、Google + APIサービスを検索します。

    b。結果リストから[Google+ API]を選択します。

    c。 APIを有効にするボタンを押します。

    処理が完了すると、有効なAPIのリストにGoogle+ APIが表示されます。 にアクセスするには、左側のサイドバーのメニューでAPI &サービスを選択し、 有効APIタブを選択します。

  4. サイドバーの「API &サービス」で、「資格情報」を選択します。

  5. [資格情報]タブで、[新しい資格情報]ドロップダウンリストを選択し、[APIキー]を選択します。
  6. [新しいキーを作成]ポップアップから、プロジェクトに適切な種類のキー(サーバーキー、ブラウザキー、Androidキー、またはiOSキー)を選択します。
  7. キー名を入力し、指示に従って他のフィールドに入力してから、「作成」を選択します。

https://developers.google.com/+/web/api/rest/oauth

+0

Googleに新しいアプリを登録すると、APIキーが提供されないので、あなたはAPIキーを取得しますか? – CalinCosmin

+1

@CalinCosmin私はそれを答えに加えました。 – Norman

+0

ありがとうございます。それは間違いなく助けてくれました – CalinCosmin

0

GoogleOptionsセットアップで追加のスコープを指定できます。認証が成功した後https://developers.google.com/identity/protocols/OpenIDConnect#discovery

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     //... 
     app.UseGoogleAuthentication(new GoogleOptions 
     { 
      AuthenticationScheme = "Google", 
      SignInScheme = "Identity.External", // this is the name of the cookie middleware registered by UseIdentity() 
      ClientId = Configuration["ExternalLoginProviders:Google:ClientId"], 
      ClientSecret = Configuration["ExternalLoginProviders:Google:ClientSecret"]}); 
      Scopes = { "profile" }; 
    } 

が次にあなたがコントローラで絵請求を取り出すことができます:

あなたが探している範囲では、追加の請求を経由して profile範囲、ファーストネームへのアクセスを格子、姓とプロフィール写真です
[HttpGet] 
    [AllowAnonymous] 
    public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null) 
    { 
     //... SignInManager<User> _signInManager; declared before 
     ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync(); 
     SignInResult signInResult = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false); 
     string email = info.Principal.FindFirstValue(ClaimTypes.Email); 
     string firstName = info.Principal.FindFirstValue(ClaimTypes.GivenName); 
     string lastName = info.Principal.FindFirstValue(ClaimTypes.Surname); 

     // profile claims 
     string picture = info.Principal.FindFirstValue("picture"); 
     string firstName = info.Principal.FindFirstValue("given_name"); 
     string lastName = info.Principal.FindFirstValue("family_name"); 
    } 
+1

、姓と名が提供されています。しかし、画像や画像はありません。 – Norman

関連する問題