我有一个MVC5应用程序,并且已经找到了如何使用Identity 2.0初次验证facebook。除了向范围添加电子邮件之外,它基本上是默认的:
var options = new FacebookAuthenticationOptions()
{
AppId = "##################",
AppSecret = "######################"
};
options.Scope.Add("email");
app.UseFacebookAuthentication(options);
在我的应用程序的另一部分中,用户可能需要升级facebook令牌以便能够发布到他们的墙上(我希望只添加options.Scope.Add("publish_stream");
)。当我删除上面的代码并将其放在catch
这里(the code below is referenced here at facebooksdk.net)内时:
try {
var client = new FacebookClient("my_access_token");
dynamic result = client.Get("me/friends");
} catch (FacebookOAuthException) {
// Our access token is invalid or expired
// Here we need to do something to handle this.
}
对于初学者来说,它不像app.
,我无法弄清楚要用什么替换它。这是怎样的正确方法?我意识到facebooksdk.net上有任何令牌请求的例子,但我希望将它与Identity 2.0集成。或者重要吗?我不确定我是否正确理解身份识别流程并且不熟悉Facebook身份验证,所以希望有人能够理解我想要做的事情并指导我?我的猜测是,我只需要将我在登录SQL表中的facebook令牌传递给facebook,在那里它会要求用户使用提升的权限重新进行身份验证?如果令牌最初不存在于Logins表中,则该过程会将其添加到那里。
为了记录,我意识到我可以最初请求权限(当用户第一次使用Facebook登录我们的网站时),但我们不会试图最初吓唬更精明的用户。因此,想法是当他们点击发布他们的文章时,如果他们选择发布到Facebook,它将首次请求升级令牌,然后希望再也不会(从来没有一部分可能是一厢情愿的想法)。
谢谢。
答案 0 :(得分:0)
在您发布的代码中,您似乎拥有要发送给Facebook的访问令牌作为授予您应用的访问令牌...而不是给定用户的访问令牌。在成功获得给定用户的访问权限后,您需要捕获(并存储)Facebook提供给您的用户访问令牌。更多相关信息: https://developers.facebook.com/docs/facebook-login/access-tokens
以下是一些使用Identity框架的示例代码(在startup_auth.cs中使用)。它捕获访问令牌并将其(作为声明)保留给给定用户。可以在以后读取访问令牌,以便在任何给定时间访问用户的facebook api。
// Facebook integration
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
AppId = ConfigurationManager.AppSettings["Facebook.appID"],
AppSecret = ConfigurationManager.AppSettings["Facebook.appSecret"],
Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
// STORE THE USER ACCESS TOKEN GIVEN TO US BY FACEBOOK FOR THIS USER
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
foreach (var x in context.User)
{
var claimType = string.Format("urn:facebook:{0}", x.Key);
string claimValue = x.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new Claim(claimType, claimValue, XmlSchemaString, "Facebook"));
}
return Task.FromResult(0);
}
}
};
facebookOptions.Scope.Add("email");
facebookOptions.Scope.Add("publish_actions");
app.UseFacebookAuthentication(facebookOptions);
现在要为用户检索访问令牌,你可以检索它(在facebook的回调函数/ url中),如下所示:
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
var accessToken = loginInfo.ExternalIdentity.Claims
.Where(c => c.Type.EndsWith("facebook:access_token"))
.FirstOrDefault();
....
}