Ricco Twitter Cifre / Google Auth con OpenIdDictServer

La nostra app richiede l’accesso tramite numero di cellulare o Google. Stiamo pianificando di digitare Twitter per l’autenticazione del numero di cellulare.

Il stream di registrazione e autenticazione come ho capito è il seguente:

  1. L’app per dispositivi mobili è ricca di autenticazione con Twitter Digits o Google Sign-in (è l’esperienza utente migliore per l’utente che esegue un’autenticazione avanzata invece di aprire una scheda del browser Web). Cifre su Twitter / Google Accedi restituisce il token di id quadro.

  2. L’app per dispositivi mobili chiama AuthServer per accedere e presenta il token di identity framework.

  3. Il server di identity framework convalida il servizio Identity Token with Digits o Google Auth Service presentato.

  4. Una volta verificato, AuthServer cercherà di trovare l’utente, se non presente ne creerà uno.

  5. AuthServer restituisce il token di accesso all’app mobile.

Ora, sto cercando le opzioni per implementare il passaggio n. 3-4.

Attualmente, ciò che ho fatto è modificare il codice punto di accesso token che accetta nome utente come numero di telefono o indirizzo e-mail e password inviati come token ID codice Google / Twitter. Ora, dal momento che auth server deve sapere che la password inviata è in realtà un token che deve essere verificato con un servizio di terze parti, ho lavorato intorno inviando il nome del servizio “Digits” o “Google” in TokenHint.

Funziona molto bene, ma mi chiedo quale sia il modo più pulito per supportare ciò che sto cercando di ottenere.

    Funziona molto bene, ma mi chiedo quale sia il modo più pulito per supportare ciò che sto cercando di ottenere.

    Andrei personalmente con un tipo di sovvenzione personalizzata:

    [HttpPost("~/connect/token")] [Produces("application/json")] public IActionResult Exchange(OpenIdConnectRequest request) { if (request.GrantType == "urn:ietf:params:oauth:grant-type:google_identity_token") { // Reject the request if the "assertion" parameter is missing. if (string.IsNullOrEmpty(request.Assertion)) { return BadRequest(new OpenIdConnectResponse { Error = OpenIdConnectConstants.Errors.InvalidRequest, ErrorDescription = "The mandatory 'assertion' parameter was missing." }); } // 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); // Manually validate the identity token issued by Google, // including the issuer, the signature and the audience. // Then, copy the claims you need to the "identity" instance. // Create a new authentication ticket holding the user identity. var ticket = new AuthenticationTicket( new ClaimsPrincipal(identity), new AuthenticationProperties(), OpenIdConnectServerDefaults.AuthenticationScheme); ticket.SetScopes( OpenIdConnectConstants.Scopes.OpenId, OpenIdConnectConstants.Scopes.OfflineAccess); return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme); } return BadRequest(new OpenIdConnectResponse { Error = OpenIdConnectConstants.Errors.UnsupportedGrantType, ErrorDescription = "The specified grant type is not supported." }); } 

    Nota che dovrai anche abilitarlo nelle opzioni OpenIddict:

     // Register the OpenIddict services. services.AddOpenIddict() // Register the Entity Framework stores. .AddEntityFrameworkCoreStores() // Register the ASP.NET Core MVC binder used by OpenIddict. // Note: if you don't call this method, you won't be able to // bind OpenIdConnectRequest or OpenIdConnectResponse parameters. .AddMvcBinders() // Enable the token endpoint. .EnableTokenEndpoint("/connect/token") // Enable the refresh token flow and a custom grant type. .AllowRefreshTokenFlow() .AllowCustomFlow("urn:ietf:params:oauth:grant-type:google_identity_token") // During development, you can disable the HTTPS requirement. .DisableHttpsRequirement(); 

    Quando invii una richiesta di token, assicurati di utilizzare il giusto grant_type e di inviare id_token come parametro di assertion , e dovrebbe funzionare.

    Ecco un esempio utilizzando i token di accesso di Facebook:

    Prestare estrema attenzione quando si implementa la routine di convalida del token, poiché questo passaggio è particolarmente sobject a errori. È molto importante convalidare tutto, compreso il pubblico (altrimenti, il tuo server sarebbe vulnerabile agli attacchi delegati confusi ).