none
OAuth Autentication - Facebook - ottenere info utente

    Domanda

  • Salve a tutti,

    ho inserito sul mio sito web la possibilità di accedervi tramite account facebook. Tutto funziona bene, ma ho due domande:

    1. Dopo aver fatto il login con i dati di accesso a facebook, questo mi dice "l'applicazione riceverà le seguenti informazioni: profilo pubblico e lista di amici" se clicco su ok, viene creato un record nella mia tabella locale degli utenti, ma come faccio a reperire le informazioni di facebook? Mi servirebbe almeno l'indirizzo email
    2. è possibile fare in modo che l'applicazione non chieda di avere accesso alla lista di amici di facebook, ma solo al profilo dell'utente che si sta registrando?

    Grazie


    Diego Riccardi

    martedì 18 febbraio 2014 09:31

Tutte le risposte

  • Ciao Diego,

    qui hai un interessante tutorials sull'argomento : Using OAuth Providers with MVC 4

    Viene descritto anche come recuperare e "storare" le informazioni aggiuntive restituite.

    Da quanto descritto le info extra che puoi recuperare al momento della registrazione sono le seguenti :

    • id
    • name
    • link
    • gender
    • accesstoken

    Quindi non c'è il dato che ti serviva, ma probabilmente tramite le API di Facebook penso che puoi recuperare amche altre informaizioni (le API le puoi scaricare come pacchetto NuGet).

    martedì 18 febbraio 2014 09:46
  • Per recuperare la lista di amici devi recuperare l'accessToken restituito dal login con Facebook ed utilizzarlo per fare una chiamata alle API che ti ritorneranno la lista.
    Questo articolo ti spiega il tutto:
    http://www.aspitalia.com/script/1141/Recuperare-Lista-Amici-Facebook-ASP.NET.aspx

    Mentre, per quanto riguarda i permessi, quelli vengono specificati nell'applicazione che hai creato in facebook (dove hai recuperato i 2 codici per poter collegare la tua applicazione)...ma onestamente non so quale sia il set minimo di permessi che puoi assegnare.

    ciao


    Andrea Dottor
    Microsoft MVP - ASP.NET/IIS
    http://blog.dottor.net

    martedì 18 febbraio 2014 09:47
  • Ho provate a scaricare quel SDK anche se io scrivo in VB e utilizzo web form. ma sembra che in giro ormai si utilizzi solo MVC e C#!!!

    Comunque non riesco a capire come faccio a recuperare l'indirizzo email dell'utente facebook.

    Suggerimenti?


    Diego Riccardi

    martedì 18 febbraio 2014 12:26
  • Guarda qui
    http://facebooksdk.net/docs/web/getting-started/#3
    nel paragrafo "Retrieving Profile Data" c'è mostrato come recuperare i dati della persona corrente, e nell'oggetto me avresti anche l'email

    var client = new FacebookClient(accessToken);
    dynamic me = client.Get("me");
    string email = me.email;

    ciao


    Andrea Dottor
    Microsoft MVP - ASP.NET/IIS
    http://blog.dottor.net

    martedì 18 febbraio 2014 13:09
  • Grazie per l'aiuto,

    ma ancora non sono riuscito a riprodurlo in VB. Il tipo dynamic dovrebbe corrispondere ad un object, giusto?

    E comunque non mi è chiaro la storia dell' accessToken, e come si fa a recuperarlo.


    Diego Riccardi

    mercoledì 19 febbraio 2014 08:36
  • L'access token lo recuperi una volta collegato l'utenza con l'account di facebook, qui trovi il codice (cerca retrieve access token):

    http://www.asp.net/mvc/tutorials/security/using-oauth-providers-with-mvc

    Per trasformare il codice da C# a VB.NET esistono anche dei tool gratuiti on line:

    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    Ciao



    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    mercoledì 19 febbraio 2014 08:43
  • Avevo già visto questo articolo, il problema è che usa MVC e io uso Web Forms.

    Lui fa riferimento al metodo ExternalLoginCallback che nel mio progetto web form non c'è, però penso che debba agire sulla pagina RegisterExternalLogin.aspx.

    Il metodo Load della pagina, che viene chiamato al ritorno dal login su facebook, contiene questo codice (out of the box, non lo scritto io):

    ProviderName = IdentityHelper.GetProviderNameFromRequest(Request)
            If [String].IsNullOrEmpty(ProviderName) Then
                Response.Redirect("~/Account/Login")
            End If
    
            If Not IsPostBack Then
                Dim manager = New UserManager()
                Dim loginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo()
                If loginInfo Is Nothing Then
                    Response.Redirect("~/Account/Login")
                End If
                Dim appuser = manager.Find(loginInfo.Login)
                If appuser IsNot Nothing Then
                    IdentityHelper.SignIn(manager, appuser, isPersistent:=False)
                    IdentityHelper.RedirectToReturnUrl(Request.QueryString("ReturnUrl"), Response)
                ElseIf User.Identity.IsAuthenticated Then
                    Dim verifiedloginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo(IdentityHelper.XsrfKey, User.Identity.GetUserId())
                    If verifiedloginInfo Is Nothing Then
                        Response.Redirect("~/Account/Login")
                    End If
    
                    Dim result = manager.AddLogin(User.Identity.GetUserId(), verifiedloginInfo.Login)
                    If result.Succeeded Then
                        IdentityHelper.RedirectToReturnUrl(Request.QueryString("ReturnUrl"), Response)
                    Else
                        AddErrors(result)
                        Return
                    End If
                Else
                    userName.Text = loginInfo.DefaultUserName
                End If
            End If

    Qui non riesco a capire dove si trova il mio accesstoken, mi aspettavo di trovarlo nell' oggetto logininfo dove ho la proprietà loginInfo.Login.ProviderKey, ma purtroppo non è quello!

    Infatti se provo ad utilizzarlo nel codice che mi hai mostrato precedentemente dall'altro articolo, mi ritorna un errore. Quello che ho scritto è:

    Dim client = New Facebook.FacebookClient(loginInfo.Login.ProviderKey)
    Dim [me] As Object = client.[Get]("me")
    Dim email As String = [me].email

    Ma mi da errore sulla prima riga dicendomi che l'accesstoken non è valido


    Diego Riccardi

    mercoledì 19 febbraio 2014 14:13
  • Fermati in debug dopo aver popolato la variabile loginInfo e verifica tra i suoi claims:

    loginInfo.ExternalIdentity.Claims

    Nel caso non sia presente, dovresti configurare il provider di facebook (nel file Startup.Auth.cs) in modo da aggiungere le info di cui hai bisogno, e per fare questo guardati come lo configurano a questo link (cercando FacebookAuthenticationOptions):
    http://www.aspitalia.com/articoli/asp.net4.5.1/introduzione-asp.net-identity-p-3.aspx

    ciao


    Andrea Dottor
    Microsoft MVP - ASP.NET/IIS
    http://blog.dottor.net

    mercoledì 19 febbraio 2014 14:39
  • Si infatti i Claims non sono presenti nell'oggetto logininfo.

    Ho provato a configurare come descritto nell'articolo di aspitalia, ma il primo pezzo di codice c# contiene delle lambda expression e anche 2 traduttori online falliscono la traduzione. 

    Non ho mai utilizzato le lambda prima e il codice che sono riuscito a scrivere è:

            Dim facebookOptions =
                New Security.Facebook.FacebookAuthenticationOptions() With { _
                 .AppId = "xxxxxxx", _
                 .AppSecret = "yyyyyyyyy", _
                 .Provider = New Security.Facebook.FacebookAuthenticationProvider() With { _
                     .OnAuthenticated = Function(context)
                                            context.Identity.AddClaim(New System.Security.Claims.Claim("FacebookToken", context.AccessToken))
                                        End Function
                    }, _
                .SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie _
        }
    
            ' Aggiungiamo gli scope alla chiamata
            facebookOptions.Scope.Add("email")
      
            app.UseFacebookAuthentication(facebookOptions)
    

    dove la function lambda viene sottolineata in verde dicendo che non restituisce valori per tutti i percorsi.

    e comunque provando ad eseguire ora il codice, quando ritorno da facebook, l'oggetto logininfo non viene valorizzato per niente e risulta nothing. Ma penso sia dovuto a qualche errore nel codice tradotto qui sopra!


    Diego Riccardi

    mercoledì 19 febbraio 2014 15:16
  • Ciao Diego.

    Avresti qualche aggiornamento? Saresti riuscito a trovare la causa del problema?

    Grazie,


    <QUESTO CONTENUTO È DISTRIBUITO "AS IS", ESCLUDENDO OGNI FORMA DI RESPONSABILITÀ DI QUALUNQUE GENERE, ESPLICITA O IMPLICITA>

    Grazie
    Il Supporto delle Comunità MSDN

    Vi preghiamo di ricordare a “Segnare come Risposta” i post che risolvono il vostro problema. Questa è di solito una modalità di riconoscimento verso chi vi ha aiutati, facilitando per il futuro la scoperta della risoluzione per gli altri visitatori.

    venerdì 28 febbraio 2014 14:58