2015-12-12 2 views
2

Мне нужно получить first_name и last_name из Facebook v2_5 OAuth. в C#, MVC 5. Я использую Microsoft.Owin.Security.Facebook 3.0.1.0.как получить first_name и last_name из facebook OAuth в MVC 5.0 C#?

`var record = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:name");` 

Я получаю имя, используя это, но мне нужно имя_имя и имя_домена отдельно. Любая помощь будет оценена. Спасибо заранее.

ответ

1

подмигнули называемые "декларативного Поля", см изменений в v2.4: https://developers.facebook.com/docs/apps/changelog#v2_4

Это будет вызов API, чтобы получить first_name и last_name:

/me?fields=name,first_name,last_name 
+0

спасибо за ваше время, я применил эти изменения еще не успех – usman

+0

не работает для меня в апи исследователя: https://developers.facebook.com/tools/explorer/?method=GET&path=me% 3Ffields% 3Dname% 2Cfirst_name% 2Clast_name & version = v2.5 – luschn

+0

Спасибо, внесли изменения в мой код, он решил мою проблему, – usman

1

Только с помощью конечной точки WASN» t достаточно, и оказывается ненужным с текущей OWIN Facebook lib, 3.1.0 - теперь вы можете указать поля в параметрах, которые вы передаете.

Мне пришлось использовать собственный поставщик аутентификации, который справляется с проблемой в библиотеке OWIN Facebook, где Facebook возвращает поля, но OWIN lib не может разобрать и собрать их для вас. Я подозреваю, что это связано с тем, что lib был спроектирован таким образом, что вы делаете заявку, а затем возвращаете ответ на этот запрос; но если вы просто называете поле, по какой-то причине он не разбирает это вообще.

В Startup.Auth:.

var facebook = new FacebookAuthenticationOptions 
{ 
    Provider = Brass9.OwinVisitor.Auth.Facebook. 
     FirstLastNameFacebookAuthenticationProvider.SplitFirstLastName(), 
#if DEBUG 
    AppId = // 
    AppSecret = // 
#else 
    AppId = // 
    AppSecret = // 
#endif 
}; 
//id,name,email,first_name,last_name 
var fbScope = facebook.Scope; 
fbScope.Add("email"); 
//fbScope.Add("first_name"); // Uncommenting this line will break auth 
facebook.Fields.Add("id"); 
facebook.Fields.Add("email"); 
facebook.Fields.Add("name"); 
facebook.Fields.Add("first_name"); 
facebook.Fields.Add("last_name"); 
app.UseFacebookAuthentication(facebook); 

Так, до сих пор я использовал новые варианты Owin Fields указать идентификатор, адрес электронной почты, имя, first_name, last_name - вместо прохождения пользовательских конечных точек в I Также был указан пользовательский AuthenticationProvider. Вот оно:

namespace Brass9.OwinVisitor.Auth.Facebook 
{ 
    public static class FirstLastNameFacebookAuthenticationProvider 
    { 
     public static FacebookAuthenticationProvider SplitFirstLastName() 
     { 
      return new FacebookAuthenticationProvider 
      { 
OnAuthenticated = async context => 
{ 
    context.Identity.AddClaim(new System.Security.Claims.Claim(
     "FacebookAccessToken", context.AccessToken)); 
    foreach (var claim in context.User) 
    { 
     var claimType = string.Format("urn:facebook:{0}", claim.Key); 
     string claimValue = claim.Value.ToString(); 

     if (!context.Identity.HasClaim(claimType, claimValue)) 
      context.Identity.AddClaim(new System.Security.Claims.Claim(
       claimType, claimValue, "XmlSchemaString", "Facebook")); 
    } 
} 
      }; 
     } 
    } 
} 

Это делает для отказа Owin Lib, чтобы разобрать эти значения, осаждение их в качестве требований в объекте пользователя loginInfo.

Наконец, для удобства, я использую последний класс, чтобы получить при этих значениях в каноническом образе через провайдер, так как разные поставщики предлагают первое и последнее имя, используя различные схемы:

namespace Brass9.OwinVisitor.Auth 
{ 
    public class ReducedClaims 
    { 
     protected Dictionary<string, string> claims; 

     public ReducedClaims(IEnumerable<System.Security.Claims.Claim> claims) 
     { 
      var _claims = claims.ToArray(); 
      this.claims = new Dictionary<string, string>(_claims.Length); 

      foreach(var claim in _claims) 
      { 
       this.claims.Add(claim.Type, claim.Value); 
      } 
     } 

     public ReducedClaims(ExternalLoginInfo loginInfo) 
      : this(loginInfo.ExternalIdentity.Claims) 
     {} 

     //http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname 
     //http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname 



     protected string chainValue(params string[] keys) 
     { 
      string val = null; 
      foreach(var key in keys) 
      { 
       if (claims.TryGetValue(key, out val)) 
        return val; 
      } 

      return val; 
     } 

     // TODO: Instead detect which service it is then use the proper string instead of just milling through guesses? 
     public string FirstName { get { return chainValue(
      "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname", // Google 
      "urn:facebook:first_name" // Facebook 
     ); } } 

     public string LastName { get { return chainValue(
      "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname", // Google 
      "urn:facebook:last_name" // Facebook 
     ); } } 
    } 
} 

Что вы можете позвонить например:

var reducedClaims = new ReducedClaims(loginInfo.ExternalIdentity.Claims); 
var firstName = reducedClaims.FirstName; 
var lastName = reducedClaims.LastName; 
0

Небольшое отклонение от ответа Криса. Хитрость заключается в том, чтобы добавлять претензии с известными типами, принимая значения из полей first_name и last_name, отправленных Facebook. По какой-то причине Microsoft library этого не делает.

var facebookOptions = new FacebookAuthenticationOptions 
{ 
    AppId = "*", 
    AppSecret = "*", 
}; 
const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string"; 
facebookOptions.Provider = new FacebookAuthenticationProvider 
{ 
    OnAuthenticated = context => 
    { 
     void addClaim(
      FacebookAuthenticatedContext ctx, 
      string faceBookClaim, 
      string aspNetClaim) 
     { 
      if (context.User.TryGetValue(faceBookClaim, out JToken t)) 
      { 
       ctx.Identity.AddClaim(
        new Claim(
         aspNetClaim, 
         t.ToString(), 
         XmlSchemaString, 
         facebookOptions.AuthenticationType)); 
      } 
     } 

     addClaim(context, "first_name", ClaimTypes.GivenName); 
     addClaim(context, "last_name", ClaimTypes.Surname); 
     return Task.CompletedTask; 
    } 
}; 

facebookOptions.Scope.Add("public_profile"); 
facebookOptions.Scope.Add("email"); 

facebookOptions.Fields.Add("email"); 
facebookOptions.Fields.Add("name"); 
facebookOptions.Fields.Add("first_name"); 
facebookOptions.Fields.Add("last_name"); 
app.UseFacebookAuthentication(facebookOptions); 
Смежные вопросы