簡體   English   中英

WebApi:如何使用源自OAuth對話框的訪問令牌調用Facebook Graph API

[英]WebApi: How to call Facebook Graph API by using an access token originated from the OAuth dialog

我有一個配置了OAuth2的ASP.NET WebApi 2.1應用程序。 我有一個Android客戶端,可以在其中使用以下方法進行身份驗證:

WebView方法(Web Api外部提供程序):重定向到https://www.facebook.com/dialog/oauth ...,用戶在此登錄,FB請求權限,重定向到我的url,捕獲它,獲得訪問令牌,完成。

Facebook SDK方法:在后台進行操作:重定向到https://graph.facebook.com/oauth ...,用戶在此登錄,FB請求權限,重定向到我的url,捕獲它,獲取訪問令牌,完成。

問題是,如果使用WebView版本,則該令牌非常適合在Web Api應用程序中授權用戶,但是我無法通過使用它來調用Graph API,因此會收到OAuthException 190(無子代碼)。

但是,如果我執行SDK授權,則可以通過Android Facebook SDK訪問Graph API,但是使用從中獲取的令牌,Web Api授權不起作用,我通過調用Authorization / UserInfo得到401。

所以我的問題是上述令牌類型可以互換嗎?

任何幫助將不勝感激。

抱歉,如果不清楚,我正在使用帶ASP.NET Identity 2.0模板的Web Api,因此該位置已經存在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,使其具有用於調用Graph API的API令牌,例如:

[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上,執行Facebook登錄后,我擁有應用程序的Web Api調用的Bearer令牌,並且可以通過調用上述操作來獲取用於訪問Graph API的令牌。

也許有更簡單的方法可以實現上述目的。 如果有,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM