2016-08-18 9 views
5

Ich versuche herauszufinden, wie meine API in der Lage ist, meinen Identitätsbenutzern einen Benutzer von Facebook zuzuordnen.Verwenden Sie OpenIdConnectServer und versuchen Sie, über API-Dienst eine Verbindung zu Facebook herzustellen

Der Anwendungskontext

Ich bin eine mobile Anwendung zu entwickeln (In Xamarin), das Login mit Benutzername/Passwort machen muss und mit Facebook. Ich habe bereits die app.UseOpenIdConnectServer Konfiguration eingestellt und die benutzerdefinierte Provider erstellt, so dass meine Anwendung bereits mit Benutzername/Passwort arbeitet.

Jetzt versuche ich diese Integration mit Facebook zu machen und finde keinen Weg, dies zu erreichen.

ich bei der Schaffung eines Service in der API wie /api/auth/login-facebook/ dachte die access-token von Facebook vorbei, aber ich brauche die access-token meiner API-Anwendung auf dem mobilen Anwendung zurückzukehren, so dass die mobile App alle anderen Dienste, die Genehmigung benötigt nennen könnte.

Irgendwelche Hilfe dazu?

Eine visuelle Art und Weise von dem, was ich versuche zu bekommen: in Mobile Application

  • Mobile Application rufen die /api/auth/login-facebook/ Bestehen der access-token von Facebook
  • In der

    1. Benutzer Presse "mit Facebook Login" API-Anwendung, ich werde die access-token mit der Facebook Paket
    2. überprüfen Wenn der Benutzer nicht existiert, werde ich ihn mit den Daten erstellen, die Facebook mir zurückgegeben und danach werde ich Genera te die access-token Zugriff auf meine API Application gewähren
    3. Wenn der Benutzer vorhanden ist, werde ich den access-token generieren Zugriff auf meine API Application
    4. Rückkehr der access-token zu der mobilen Anwendung zu gewähren, damit sie die anderen Dienste aufrufen

    Wenn mein Wissen falsch ist und ich diese Integration/Login auf eine andere Weise tun sollte, bitte frei, es mir zu sagen!

  • Antwort

    7

    Der von Ihnen beschriebene Ablauf ist sehr ähnlich zu "assertion grants", ein Fluss, der letztes Jahr standardized war.

    Um diesen Ablauf zu verwenden, müssen Sie normalerweise ein Standard-Token vom externen Anbieter (z. B. eine JWT- oder SAML-Assertion) abrufen, damit Ihr eigener Autorisierungsserver validate it die extrahierten Ansprüche extrahieren kann. Leider kann man das nicht mit Facebook oder den meisten sozialen Anbietern im Allgemeinen machen.

    A new OAuth2 draft wird wahrscheinlich dazu beitragen, dass in der Zukunft zu ändern, aber es wird wahrscheinlich eine Weile dauern, bevor große Dienste beginnen, es zu implementieren.

    Die gute Nachricht ist, dass nichts daran hindert, in der Zwischenzeit einen eigenen "Facebook Access Token" Grant-Typ zu erstellen.Hier ist, wie Sie die Behauptung Zuschuss mit ASOS beta6 implementieren könnte:

    public override Task ValidateTokenRequest(ValidateTokenRequestContext context) 
    { 
        // Reject the token request if it doesn't use grant_type=password, refresh_token 
        // or urn:ietf:params:oauth:grant-type:facebook_access_token. 
        if (!context.Request.IsPasswordGrantType() && 
         !context.Request.IsRefreshTokenGrantType() && 
         context.Request.GrantType != "urn:ietf:params:oauth:grant-type:facebook_access_token") 
        { 
         context.Reject(
          error: OpenIdConnectConstants.Errors.UnsupportedGrantType, 
          description: "The specified grant type is not supported by this server."); 
    
         return Task.FromResult(0); 
        } 
    
        // Reject the token request if the assertion parameter is missing. 
        if (context.Request.GrantType == "urn:ietf:params:oauth:grant-type:facebook_access_token" && 
         string.IsNullOrEmpty(context.Request.Assertion)) 
        { 
         context.Reject(
          error: OpenIdConnectConstants.Errors.InvalidRequest, 
          description: "The assertion is missing."); 
    
         return Task.FromResult(0); 
        } 
    
        // Since there's only one application and since it's a public client 
        // (i.e a client that cannot keep its credentials private), call Skip() 
        // to inform the server the request should be accepted without 
        // enforcing client authentication. 
        context.Skip(); 
    
        return Task.FromResult(0); 
    } 
    
    public override Task HandleTokenRequest(HandleTokenRequestContext context) 
    { 
        // Only handle grant_type=password and urn:ietf:params:oauth:grant-type:facebook_access_token 
        // requests and let the OpenID Connect server middleware handle the refresh token requests. 
        if (context.Request.IsPasswordGrantType()) 
        { 
         // Skipped for brevity. 
        } 
    
        else if (context.Request.GrantType == "urn:ietf:params:oauth:grant-type:facebook_access_token") 
        { 
         // The assertion corresponds to the Facebook access token. 
         var assertion = context.Request.Assertion; 
    
         // Create a new ClaimsIdentity containing the claims that 
         // will be used to create an id_token and/or an access token. 
         var identity = new ClaimsIdentity(OpenIdConnectServerDefaults.AuthenticationScheme); 
    
         // Validate the access token using Facebook's token validation 
         // endpoint and add the user claims you retrieved here. 
         identity.AddClaim(ClaimTypes.NameIdentifier, "FB user identifier"); 
    
         // Create a new authentication ticket holding the user identity. 
         var ticket = new AuthenticationTicket(
          new ClaimsPrincipal(identity), 
          new AuthenticationProperties(), 
          OpenIdConnectServerDefaults.AuthenticationScheme); 
    
         // Set the list of scopes granted to the client application. 
         ticket.SetScopes(new[] 
         { 
          /* openid: */ OpenIdConnectConstants.Scopes.OpenId, 
          /* email: */ OpenIdConnectConstants.Scopes.Email, 
          /* profile: */ OpenIdConnectConstants.Scopes.Profile, 
          /* offline_access: */ OpenIdConnectConstants.Scopes.OfflineAccess 
         }.Intersect(context.Request.GetScopes())); 
    
         context.Validate(ticket); 
        } 
    
        return Task.FromResult(0); 
    } 
    

    enter image description here

    +0

    Es funktioniert! Danke Kevin! Deine Hilfe war großartig. –

    +0

    @RaphaelFurlan froh, dass es funktioniert hat;) – Pinpoint

    Verwandte Themen