抱歉,如果不清楚,我正在使用带有 ASP.NET Identity 2.0 模板的 Web Api,因此 OAuth 管道代码已经存在。
我已经找到了我自己问题的答案,让我与你分享。
所以问题是我在重定向后从 Facebook 的 OAuth 对话框获得的令牌与我的应用程序可以用来以实际用户的名义调用 Facebook Graph API 的令牌不同。该 Graph API 令牌可在以下位置访问:
假设您使用上面提到的模板,您可以找到 App_Data/Startup.Auth.cs 类,其中定义了 FacebookAuthenticationOptions 实例。在那里,您可以捕获 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 令牌来调用 Graph 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 的令牌。
也许有更简单的方法可以实现上述目标。如果你找到了请告诉我。