3

Je rencontre des problèmes avec l'authentification Facebook pour les services mobiles dans Azure.Authentification avec Facebook pour les services mobiles dans Azure

Pour être plus précis, j'ai déjà une application qui utilise Facebook C# SDK et cela fonctionne très bien. Je peux me connecter, aller chercher la liste de mes amis et ainsi. Je souhaite continuer à utiliser ce SDK, mais je souhaite également m'authentifier pour Azure Mobile Service. Donc, mon plan était, connectez-vous avec Facebook C# SDK (comme je le fais déjà aujourd'hui), obtenir le jeton d'authentification, et le passer à la fonction MobileServiceClient.LoginAsync(). De cette façon, je peux toujours avoir toutes les fonctionnalités intéressantes dans Facebook C# SDK, et également utiliser le système d'authentification intégré dans les services mobiles pour Azure.

var client = new FacebookClient(); 

dynamic parameters = new ExpandoObject(); 
parameters.client_id = App.FacebookAppId; 
parameters.redirect_uri = "https://www.facebook.com/connect/login_success.html"; 
parameters.response_type = "token"; 
parameters.display = "popup"; 

var loginUrl = client.GetLoginUrl(parameters); 
WebView.Navigate(loginUrl); 

Lorsque la charge est terminée, followin est exécuté:

FacebookOAuthResult oauthResult; 
if (client.TryParseOAuthCallbackUrl(e.Uri, out oauthResult) && oauthResult.IsSuccess) 
{ 
    var accessToken = oauthResult.AccessToken; 
    var json = JsonObject.Parse("{\"authenticationToken\" : \"" + accessToken + "\"}"); 
    var user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook, json); 
} 

Cependant, je reçois cette exception quand je l'appelle la dernière ligne de code ci-dessus: MobileServiceInvalidOperationException, « Erreur: la demande de connexion POST Facebook doit spécifier le jeton d'accès dans le corps de la requête. "

Je ne trouve aucune information sur la façon de formater le accesstoken, j'ai essayé beaucoup de différentes clés (au lieu de "authenticationToken" comme vous le voyez dans mon exemple). J'ai aussi essayé juste de passer la chaîne accesstoken, mais rien ne semble fonctionner. En outre, si j'utilise MobileServiceClient.LoginAsync() pour créer une nouvelle connexion, cela fonctionne très bien, mais il semble stupide de forcer les utilisateurs à se connecter deux fois.

Toute aide est grandement appréciée!

Répondre

1

Le format attendu pour l'objet est {"access_token", "the-real-access-token"}. Une fois la connexion terminée à l'aide du SDK Facebook, le jeton est renvoyé dans le fragment portant ce nom. C'est ce que le service Azure Mobile attend.

BTW, c'est un code que j'ai écrit, basé sur votre extrait, qui fonctionne. Il devrait mieux gérer les cas qui ont échoué, mais pour le format de jeton, cela devrait être suffisant

private void btnLoginFacebookToken_Click_1(object sender, RoutedEventArgs e) 
{ 
    var client = new Facebook.FacebookClient(); 
    dynamic parameters = new ExpandoObject(); 
    parameters.client_id = "MY_APPLICATION_CLIENT_ID"; 
    parameters.redirect_uri = "https://www.facebook.com/connect/login_success.html"; 
    parameters.response_type = "token"; 
    parameters.display = "popup"; 
    var uri = client.GetLoginUrl(parameters); 
    this.webView.LoadCompleted += webView_LoadCompleted; 
    this.webView.Visibility = Windows.UI.Xaml.Visibility.Visible; 
    this.webView.Navigate(uri); 
} 
async void webView_LoadCompleted(object sender, NavigationEventArgs e) 
{ 
    AddToDebug("NavigationMode: {0}", e.NavigationMode); 
    AddToDebug("Uri: {0}", e.Uri); 
    string redirect_uri = "https://www.facebook.com/connect/login_success.html"; 
    bool close = (e.Uri.ToString().StartsWith(redirect_uri)); 
    if (close) 
    { 
     this.webView.LoadCompleted -= webView_LoadCompleted; 
     this.webView.Visibility = Windows.UI.Xaml.Visibility.Collapsed; 
     string fragment = e.Uri.Fragment; 
     string accessToken = fragment.Substring("#access_token=".Length); 
     accessToken = accessToken.Substring(0, accessToken.IndexOf('&')); 
     JsonObject token = new JsonObject(); 
     token.Add("access_token", JsonValue.CreateStringValue(accessToken)); 
     try 
     { 
      var user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token); 
      AddToDebug("Logged in: {0}", user.UserId); 
     } 
     catch (Exception ex) 
     { 
      AddToDebug("Error: {0}", ex); 
     } 
    } 
} 
Questions connexes