2014-10-02 30 views
1

我有一个配置了OAuth2的ASP.NET WebApi 2.1应用程序。我有Android客户端,我可以使用以下方法进行身份验证:WebApi:如何使用源自OAuth对话框的访问令牌调用Facebook Graph API

WebView方法(Web Api外部提供程序):重定向到https://www.facebook.com/dialog/oauth ...,用户在那里登录,FB请求权限,重定向到我的url ,抓住它,获取令牌,完成。

Facebook的SDK的方法:它的底线:重定向到https://graph.facebook.com/oauth ...,用户在那里登录,FB要求权限,重定向到我的网址,抓住它,访问令牌得到,完成。

问题是,如果我使用WebView版本,令牌对我的Web Api应用程序中的用户授权很有用,但我无法使用它调用Graph API,因此我收到OAuthException 190(无子代码)。

但是,如果我做SDK授权,图形API可以访问(通过Android Facebook SDK),但使用我从它得到的令牌,Web Api授权不起作用,我通过调用Authorization/UserInfo获得401 。

所以我的问题是上述标记类型可以互换吗?

任何帮助将不胜感激。

+1

我不确定您使用Web API个人帐户模板配置的OAuth2 Web API的含义是什么? 我之前发布了如何获取FB令牌(外部访问令牌),然后用本地访问令牌(由本地权限生成)替换它。所以你现在会有2个令牌,本地的对Web API有好处,外部的对于调用FB图API是很好的。 在这里检查http:// bitoftech。net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/ – 2014-10-02 08:36:50

+0

谢谢,你的评论帮助我找到了适合项目的解决方案我正在使用的模板。我在下面解释了我的解决方案。 – unbornchikken 2014-10-02 14:37:07

+0

不客气,如果有用的话,请点我的评论。 – 2014-10-02 14:54:05

回答

0

对不起,如果不清楚,我正在使用Web API瓦特/ ASP.NET身份2.0模板,所以OAuth管道代码已经存在那里。

我能找到我自己问题的答案,让我与你分享。

所以问题是,重定向后我从Facebook的OAuth对话框获得的令牌与我的应用程序可用于以实际用户名称调用Facebook Graph API不同。该Graph API令牌可在以下位置访问:

假设您使用上述模板,可以使用FacebookAuthenticationOptions实例的定义找到App_Data/Startup.Auth.cs类。在那里您可以捕获API令牌并将其保存到数据库中。例如:

var fbopts = new FacebookAuthenticationOptions 
{ 
    AppId = Global.Config.ExternalServices.FacebookAppID, 
    AppSecret = Global.Config.ExternalServices.FacebookAppSecret, 
    Scope = { "email", "user_friends", "publish_actions" }, 
    Provider = new FacebookAuthenticationProvider 
    { 
     OnAuthenticated = async context => 
     { 
      // This token will be OK for calling Graph API 
      string accessToken = context.AccessToken; 

      using (var tracer = Global.Tracer.CreateBuilder()) 
      { 
       try 
       { 
        tracer.InformationLine("Storing Facebook OAuth token: " + accessToken); 
        string fbUserID = context.Identity.GetUserId(); 
        string fbUserName = context.Identity.Name; 
        tracer.InformationLine("Facebook User ID: " + fbUserID); 
        tracer.InformationLine("Facebook User Name: " + fbUserName); 

        // Store it into the db 
        // assume Task StoreOAuthToken(string providerName, string providerKey, string accessToken) is defined 
        await StoreOAuthToken("Facebook", fbUserID, accessToken);      
       } 
       catch (Exception ex) 
       { 
        tracer.ErrorLine("Failed.", ex); 
       } 
      } 
     } 
    } 
}; 
app.UseFacebookAuthentication(fbopts); 

此时你得在由以下各列的表中的一行:

OAuthAccessToken.ProviderName 
OAuthAccessToken.ProviderKey 
OAuthAccessToken.AccessToken 

现在你可以提供一个API,将消费者有API令牌调用图形API,如:做一个Facebook登录后

[Route("AccessTokens")] 
[Authorize] 
public async Task<List<OAuthAccessToken>> GetAccessTokens(string providerName = null) 
{ 
    var userID = User.Identity.GetUserId(); 

    var q = from l in this.Context.AspNetUserLogins // Managed by ASP.NET Identity 2.0 
      from t in this.Context.OAuthAccessTokens // Stored by you with above code 
      where l.UserId == userID && t.ProviderName == l.LoginProvider && t.ProviderKey == l.ProviderKey 
      select t; 

    if (!string.IsNullOrEmpty(providerName)) q = q.Where(t => t.ProviderName == providerName); 

    return await q.ToListAsync(); 
} 

所以在Android上我有承载令牌我的应用程序的Web API调用,我可以让我的令牌通过调用访问图形API以上行动。

也许有更简单的方法来实现上述。请让我知道,如果你找到任何。

相关问题