[英]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.