2016-07-03 46 views
7

Attualmente ho una soluzione di backend per la mia app che utilizza App per dispositivi mobili di Azure. Ho abilitato accessi a Facebook, Twitter, Google e Microsoft. Sto tentando di aggiungere un flusso di accesso personalizzato oltre a questo. Ho installato un account e un'applicazione Auth0 e sono in grado di ottenere un token e un profilo da auth0 quando faccio la richiesta in-app usando il widget lock di auth0.Autenticazione personalizzata di app mobili Azure con Cordova

Ho seguito questa guida: https://shellmonger.com/2016/04/08/30-days-of-zumo-v2-azure-mobile-apps-day-5-custom-authentication/ e sono arrivato allo stage 'Verifica JWT personalizzata nel server' ma questo è il punto in cui sono bloccato ... il mio backend è in C# non node.js, quindi come faccio a fare l'equivalente di questo tutorial e convalidare il token JWT e successivamente accedere ai controller di tabella dalla mia applicazione di front-end utilizzando azureClient.login/azureClient.table?

EDIT: Va bene così, come si vedrà nel thread commento qui sotto con @AdrianHall ho avuto successo nel generare un gettone da dentro il mio Cordova app, ma la mia pietra d'inciampo è ora ottenere il servizio di accettarla , senza dover scambia tokens. Questo è possibile secondo la guida pubblicata.

Questo è il mio codice lato client che attualmente effettua la chiamata auth a auth0 e fa un po 'di configurazione lato client per ottenere un ID utente e generare l'oggetto' currentUser 'che contiene il nuovo token.

auth0.lock.show(auth0.options, function(err, profile, token) { 
    if (err) { 
    console.error('Error authenticating with Auth0: ', err); 
    alert(err); 
    } else { 
    debugger; 
    var userID; 
    if (profile.user_id.indexOf("auth0") > -1) { 
     userID = profile.user_id.replace("auth0|", ""); 
    } else if (profile.user_id.indexOf("facebook") > -1) { 
     userID = profile.user_id.replace("facebook|", ""); 
    } else if (profile.user_id.indexOf("twitter") > -1) { 
     userID = profile.user_id.replace("twitter|", ""); 
    } else if (profile.user_id.indexOf("microsoft") > -1) { 
     userID = profile.user_id.replace("microsoft|", ""); 
    } else if (profile.user_id.indexOf("google-oauth2") > -1) { 
     userID = profile.user_id.replace("google-oauth2|", ""); 
    } 
    window.azureClient.currentUser = { 
     userId: userID, 
     profile: profile, 
     mobileServiceAuthenticationToken: token 
    }; 

    //A client session has now been created which contains attributes relevant to the currently logged in user. 

    console.log("window.azureClient.currentUser", window.azureClient.currentUser); 
    window.localStorage.setItem("currentUser", JSON.stringify(window.azureClient.currentUser)); 
    //Call the get profile function which will call our API to get the user's activities and bio etc. 
    getProfile(); 
    } 

codice backend MobileAppSettingsDictionary

settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings(); 

     if (string.IsNullOrEmpty(settings.HostName)) 
     { 
      //This middleware is intended to be used locally for debugging.By default, HostName will 

      //only have a value when running in an App Service application. 
      app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions 
      { 
       SigningKey = ConfigurationManager.AppSettings[""], 
       ValidAudiences = new[] { ConfigurationManager.AppSettings[""] }, 
       ValidIssuers = new[] { ConfigurationManager.AppSettings["https://domain.eu.auth0.com/"] }, 
       TokenHandler = config.GetAppServiceTokenHandler() 
      }); 
     } 
+0

Grazie per la modifica. Peccato che tu non abbia potuto fornire una risposta per la taglia. – anthonyhumphreys

risposta

5

Nel Azure Mobile Apps C# backend, c'è un file App_Start\Startup.Mobile.cs con il seguente codice:

MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings(); 

    if (string.IsNullOrEmpty(settings.HostName)) 
    { 
     // This middleware is intended to be used locally for debugging. By default, HostName will 
     // only have a value when running in an App Service application. 
     app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions 
     { 
      SigningKey = ConfigurationManager.AppSettings["SigningKey"], 
      ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] }, 
      ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] }, 
      TokenHandler = config.GetAppServiceTokenHandler() 
     }); 
    } 

La chiamata app.UseAppServiceAuthentication imposta la configurazione necessario per decodificare il tuo JWT. Hai solo bisogno di capire che cosa il tuo pubblico (il campo aud in JWT) e l'emittente (il campo iss nel JWT). Nel caso Auth0, Pubblico è il tuo ClientId e dell'Emittente "https://your-domain-value" - il Segreto cliente è il key signing

È possibile verificare un esempio JWT da cut-and-paste a https://jwt.io - questo mostrerà in modo esplicito quali sono i valori dovrebbero essere e consentire di verificare la firma.

+0

Oh wow l'uomo stesso. Grazie mille per il tuo blog - è un grande vantaggio per la comunità :) Darò un'occhiata a ciò che hai detto domani. Grazie per l'assistenza. – anthonyhumphreys

+0

Un'ultima domanda: quale chiamata dovrei fare dal front-end all'azzurro per autorizzare? – anthonyhumphreys

+1

@anthonyhumphreys Vedi [Aggiungi autenticazione all'app Apache Cordova] (https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-cordova-get-started-users/). –