2013-12-17 3 views
7

Я пытаюсь реализовать facebook-логин с использованием токена-носителя. Я создал новый проект в VS 2013 и выбрал индивидуальную аутентификацию учетной записи пользователя, как в этом тулаториальном http://www.asp.net/web-api/overview/security/external-authentication-services.Facebook-логин с использованием внешнего токена-носителя (MVC4 Web Api)

Я настроил аутентификации facebook:

app.UseFacebookAuthentication(
      appId: "123[...]", 
      appSecret: "123[...]"); 

И все отлично работает.

Мой метод испытания:

[OverrideAuthentication] 
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] 
[Route("ExternalLogin2", Name = "ExternalLogin2")] 
public async Task<IHttpActionResult> GetExternalLogin2() 
{ 
    ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); 
    return Ok(); 
} 

Я не понимаю, как [HostAuthentication (DefaultAuthenticationTypes.ExternalBearer)] работает.

Я призываю запрос GET в стельку:

GET http://localhost:17353/api/Account/ExternalLogin2 HTTP/1.1 
Authorization: Bearer [my facebook token] 
Content-Length: 28 
Host: localhost:17353 

Но я получаю 401 результат.

Что я должен сделать для аутентификации внешним токеном?

+0

Где вы получаете жетон facebook от? –

+0

@Neshta Вы нашли решение здесь? – Syska

+0

Такая же проблема здесь. У меня есть токен facebook, но я не могу получить доступ к методу WebAPI, помеченному внешним носителем. – creatiive

ответ

1

Я не нашел решение этой проблемы. Но я решил задачу по-другому. Я добавил HTTP-заголовок X-Facebook-Token и передал его там. В переопределенном методе GrantResourceOwnerCredentials (контекст) OAuthAuthorizationServerProvider я поймал токен из контекста. Request.Headers ["X-Facebook-Token"].

string facebookToken = context.Request.Headers["X-Facebook-Token"]; 
if (facebookToken == null) 
{ 
    context.SetError("invalid_grant", "Facebook token was not found in X-Facebook-Token header."); 
    return; 
} 

dynamic facebookUser; 
if (!FacebookUtil.TryGetUser(facebookToken, out facebookUser)) 
{ 
    context.SetError("invalid_grant", "Facebook token is incorrect."); 
    return; 
} 

В FacebookUtil.TryGetUser() я использовал Facebook библиотеку http://www.nuget.org/packages/facebook

public static bool TryGetUser(string facebookToken, out dynamic user) 
{ 
    var facebookClient = new FacebookClient(facebookToken) 
    { 
     AppId = AppSettings.FacebookAppId, 
     AppSecret = AppSettings.FacebookAppSecret 
    }; 

    try 
    { 
     user = facebookClient.Get("me"); 
     return true; 
    } 
    catch (Exception) 
    { 
     user = null; 
     return false; 
    } 
} 
Смежные вопросы