2017-05-27 4 views
2

.NET Core Web APIアプリケーション認証に問題があります。 私はしたい: 1)モバイルアプリ(現iOS)のGoogleでユーザーを認証 2)この認証を使用して、AspNetCore.IdentityとEntity Frameworkコアを使用してデータベースにユーザーレコードを作成します 3)同じ認証を使用してGoogleカレンダーAPI .NETのコアサーバモバイルアプリケーションでの認証後に.NETコアサーバーでユーザーにサインインする方法

からこれまでのところ、私は1と3を実装する方法を考え出したが、数2

まわりで私の頭をラップすることができない私の理解では、サードパーティと認証されたユーザーに署名することで、ドキュメンテーションのために、SignInManagerインスタンスメソッドExternalLoginSignInAsyncを使用する必要があります。 ログインプロバイダ(単純な "Google"とします)とユニークプロバイダキーの2つの引数をとります。私の問題は、私がどこで入手できるのかわからないことです。ここで

は、私は、モバイルアプリ上での結果では、Googleのログインから受信したすべてのもののリストです: enter image description here

ここで私がで呼び出そうとする方法がある

// POST api/signup 
    [HttpPost] 
    public async Task<bool> Post([FromBody]string authorizationCode, [FromBody]string userId) 
    { 
     var tokenFromAuthorizationCode = await GetGoogleTokens(userId, authorizationCode); 
     var result = await signInManager.ExternalLoginSignInAsync(
      "Google", tokenFromAuthorizationCode.IdToken, false); 
     if (result.Succeeded) 
      return true; 

     var externalLoginInfo = new ExternalLoginInfo(
      ClaimsPrincipal.Current, "Google", tokenFromAuthorizationCode.IdToken, null); 
     return await SignInUser(externalLoginInfo); 
    } 

    private async Task<bool> SignInUser(ExternalLoginInfo info) 
    { 
     var newUser = new AppUser { Email = "[email protected]", UserName = "TestUser" }; 
     var identResult = await userManager.CreateAsync(newUser); 
     if (identResult.Succeeded) 
     { 
      identResult = await userManager.AddLoginAsync(newUser, info); 
      if (identResult.Succeeded) 
      { 
       await signInManager.SignInAsync(newUser, false); 
       return true; 
      } 
     } 

     return false; 
    } 

    private async Task<TokenResponse> GetGoogleTokens(string userId, string authorizationCode) 
    { 
     TokenResponse token; 
     try 
     { 
      // TODO: Save access and refresh token to AppUser object 
      token = await authFlow.Flow.ExchangeCodeForTokenAsync(
       userId, authorizationCode, "http://localhost:60473/signin-google", CancellationToken.None); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      throw; 
     } 

     return token; 
    } 

私の質問は次のとおりです。ですREST API経由で認証を構築している場合は正しいパスになります。その場合は、Googleのプロバイダキーはどこで入手できますか? ありがとうございます。

答えて

0

まあ、明らかに、キープロバイダでは、GoogleからわずかユーザーIDです。 私のために働いた解決策は次のとおりです。

 [HttpPost] 
    public async Task<AppUser> Post([FromBody]GoogleSignInCredentials credentials) 
    { 
     // 1. get user id from idToken 
     var oauthService = new Oauth2Service(new BaseClientService.Initializer { ApiKey = "{your api key}" }); 
     var tokenInfoRequest = oauthService.Tokeninfo(); 
     tokenInfoRequest.IdToken = credentials.IdToken; 
     var userInfo = await tokenInfoRequest.ExecuteAsync(); 

     // 2. get access_token and refresh_token with new id and authorization code 
     var tokenFromAuthorizationCode = await GetGoogleTokens(userInfo.UserId, credentials.AuthorizationCode); 

     // 3. check if user exists 
     var result = await _signInManager.ExternalLoginSignInAsync(
      "Google", userInfo.UserId, false); 
     if (result.Succeeded) 
      return await _userManager.FindByEmailAsync(userInfo.Email); 

     // 4. create user account 
     var externalLoginInfo = new ExternalLoginInfo(
      ClaimsPrincipal.Current, "Google", userInfo.UserId, null); 

     // 5. fetch user 
     var createdUser = await SignInUser(externalLoginInfo, userInfo.Email); 
     if (createdUser != null) 
     { 
      createdUser.GoogleAccessToken = tokenFromAuthorizationCode.AccessToken; 
      createdUser.GoogleRefreshToken = tokenFromAuthorizationCode.RefreshToken; 
      var updateResult = await _userManager.UpdateAsync(createdUser); 
      if (updateResult.Succeeded) 
       return createdUser; 

      return null; 
     } 

     return null; 
    } 

    private async Task<AppUser> SignInUser(ExternalLoginInfo info, string email) 
    { 
     var newUser = new AppUser { Email = email, UserName = email }; 
     var identResult = await _userManager.CreateAsync(newUser); 
     if (identResult.Succeeded) 
     { 
      identResult = await _userManager.AddLoginAsync(newUser, info); 
      if (identResult.Succeeded) 
      { 
       await _signInManager.SignInAsync(newUser, false); 
       return await _userManager.FindByEmailAsync(email); 
      } 
     } 

     return null; 
    } 

    private async Task<TokenResponse> GetGoogleTokens(string userId, string authorizationCode) 
    { 
     return await _authFlow.Flow.ExchangeCodeForTokenAsync(
       userId, authorizationCode, "http://localhost:60473/signin-google", CancellationToken.None); 
    } 
関連する問題