2015-05-14 10 views
10

Ich verstehe nicht, warum ihre ist kein klares Tutorial oder Richtlinie zu diesem Thema, so dass ich hoffe, meine Frage kann hier beantwortet werden.Registrieren Externe Login Web API

Also, versuchen, Benutzer von Facebook oder Google registrieren, über die Web-API.

Das Problem ist, an der RegisterExternal Methode, auf dieser Linie:

var info = await Authentication.GetExternalLoginInfoAsync(); 

Es gibt null zurück, und damit ein BadRequest()

Rückkehr Was ich so weit gekommen:

In Startup.Auth.cs Ich habe die IDs und die Geheimnisse hadded, beachten Sie, dass ich auch versucht habe mit Microsoft.Owin.Security.Facebook

var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions 
      { 
       AppId = "103596246642104", 
       AppSecret = "1c9c8f696e47bbc661702821c5a8ae75", 
       Provider = new FacebookAuthenticationProvider() 
       { 
        OnAuthenticated = (context) => 
        { 
         context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook")); 

         return Task.FromResult(0); 
        } 
       }, 
      }; 
      facebookOptions.Scope.Add("email"); 
      app.UseFacebookAuthentication(facebookOptions); 



      app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() 
      { 
      ClientId = "328779658984-t9d67rh2nr681bahfusan0m5vuqeck13.apps.googleusercontent.com", 
      ClientSecret = "ZYcNHxBqH56Y0J2-tYowp9q0", 
      CallbackPath = new PathString("/api/Account/ManageInfo") 
     }); 

facebookOptions Quelle: this post

Das zusätzliche facebookOptions nicht das Problem lösen hat.

Ich kann ein access_token von Google und Facebook abrufen. Ich bin auch mit diesem access_token zu api/Account/UserInfo

GET http://localhost:4856/api/Account/UserInfo 
in the header: 
Authorization: Bearer R9BTVhI0... 

zu Authentifizieren der Lage Welche zurück: {"Email":"firstname lastname","HasRegistered":false,"LoginProvider":"Facebook"}

Eine Frage, die ich ihr bemerken, ist, dass es meinen Namen als E-Mail zurück, nicht die eigentliche E-Mail-Adresse ein.

Jetzt möchte ich die externe Login mit einem neuen Benutzer für meine Datenbank registrieren, die ich eine POST-Aufruf wie folgt machen:

POST http://localhost:4856/api/Account/RegisterExternal 
[header] 
authorization: bearer 6xcJoutY... 
Content-Type: application/json 
[body] 
{"Email":"[email protected]"} 

Quelle: this post

Nun ist diese auf diese eine BadRequest kehrt Code snippit, innen RegisterExternal():

public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl) 
    { 
if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 
      //AuthenticationManger? 
      var info = await Authentication.GetExternalLoginInfoAsync(); 
      if (info == null) 
      { 
       return InternalServerError(); 
      } 

In Debugging funktioniert die ExternalLoginConfirmationViewModel meine E-mail-Adresse enthalten.

Was mache ich falsch? Muss ich etwas zum Startup.cs hinzufügen? Gibt es noch etwas, was ich in der Startup.Auth.cs zu tun habe? Rufe ich falsch RegisterExternal? In MVC geht es so reibungslos, warum nicht in der Web-API?

Aso sah this answer von this question, aber ich habe nicht verstanden, wie dies zu implementieren ist.

+0

War dies jemals gelöst? Ich habe das gleiche Problem. –

+2

Schließlich habe ich die Authentifizierung mit Facebook auf der App-Seite gemacht, wie es bei der Entwicklung von Apps sein sollte. Verwenden Sie dann das externe Zugriffstoken, um meine Benutzer bei meiner API zu registrieren. Im Anschluss an diese Anleitung: http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/ Wenn Sie externen Zugriff haben Token, können Sie das verwenden, um die Benutzerinformationen mit dem Facebook Graph API zu erhalten. Hier ist eine Antwort für diese in Android: http://StackOverflow.com/Questions/31314124/get-Email-and-Na-Facebook-SDK-V4-4-0-Switch – CularBytes

+0

Vielen Dank, sehr hilfreich. –

Antwort

4

Diese Methode ist nicht wirklich praktisch, da Sie eine API entwickeln, die höchstwahrscheinlich für Apps verwendet wird. Am besten handhaben Sie den Login mit Facebook durch den API-Consumer und lassen Sie Ihnen eine Facebook-Authentifizierung zukommen Zeichen.

Im Grunde war ich versuche, dies zu tun:

  1. erstellen externen Login-Link für Facebook.
  2. Benutzer an diesen Link senden, der sie zur Facebook Login-Seite bringt.
  3. Nach dem Login wird Facebook auf api umleiten.
  4. Benutzer würde registriert werden, aber wie weiß die App/Website, die die API verbraucht?

Was Sie tun möchten, ist dies:

  1. API Verbraucher ihre eigene Methode erstellt mit Facebook anmelden (für Apps via SDK)
  2. API Verbraucher auf eine Facebook-Token an die API senden Registrieren/Anmelden
  3. API wird Token mit Facebook Graph Endpunkt überprüfen.
  4. Wenn die API erfolgreich ist, gibt sie ein Trägertoken für die API zurück, um weitere authentifizierte Anforderungen zu stellen.

für Sie also als eine API-Entwickler, würden Sie das Token wie so überprüfen:

var verifyTokenEndPoint = string.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", accessToken, appToken); 

Und dann die Benutzer-ID erhalten

var client = new HttpClient(); 
var uri = new Uri(verifyTokenEndPoint); 
var response = await client.GetAsync(uri); 

if (response.IsSuccessStatusCode) 
{ 
    var content = await response.Content.ReadAsStringAsync(); 

    dynamic jObj = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(content); 

    string user_id = jObj["data"]["user_id"]; 
    string app_id = jObj["data"]["app_id"]; 
} 

Schließlich würden Sie einen Benutzer erstellen oder finden wie also:

IdentityUser user = await _userManager.FindAsync(new UserLoginInfo(provider, verifiedAccessToken.user_id)); 

Und dann ist es alles an Ihnen, wie man c einen Träger Token reate, wenn Sie das Tutorial folgen unten aufgeführt, könnten Sie dies haben:

var tokenExpiration = TimeSpan.FromMinutes(30); 

ClaimsIdentity identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType); 

identity.AddClaim(new Claim(ClaimTypes.Name, userName)); 
identity.AddClaim(new Claim("role", "user")); 

var props = new AuthenticationProperties() 
{ 
    IssuedUtc = DateTime.UtcNow, 
    ExpiresUtc = DateTime.UtcNow.Add(tokenExpiration), 
}; 

var ticket = new AuthenticationTicket(identity, props); 

var accessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket); 

Quelle, mit voller Tutorial here

ich auch die E-Mail über das SDK haben und dass senden zusammen mit die POST-Anfrage, da ich sowohl die API als auch den Consumer verwaltet habe. Warnung: Ein Facebook-Benutzer möchte Ihnen möglicherweise keine E-Mail-Adresse geben.

Get nach Facebook-Login auf Android E-Mail und IOS