Integrate facebooksdk with Identity 2.0

本文关键字:Identity with facebooksdk Integrate | 更新日期: 2023-09-27 18:01:24

我有一个MVC5应用程序,并已经弄清楚如何使用Identity 2.0最初与facebook进行身份验证。除了将email添加到作用域之外,它基本上是默认的:

        var options = new FacebookAuthenticationOptions()
        {
            AppId = "##################",
            AppSecret = "######################"
        };
        options.Scope.Add("email");
        app.UseFacebookAuthentication(options);

在我的应用程序的另一部分,这是可能的,用户需要升级facebook令牌,以便能够发布到他们的墙(我希望只是添加options.Scope.Add("publish_stream");)。当我剪掉上面的代码并将其放在这里的catch中(下面的代码在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,它会要求用户使用提升的权限重新身份验证?如果令牌最初不存在于登录表中,则进程将把它添加到那里。

郑重声明,我意识到我一开始可以请求权限(当用户第一次用facebook登录我们的网站时),但我们一开始尽量不吓跑更精明的用户。所以,这个想法是,当他们点击发布他们的文章时,如果他们选择发布到facebook,那么它将第一次请求升级令牌,然后希望再也不会(其中从未部分可能是一厢情愿的想法)。

谢谢。

Integrate facebooksdk with Identity 2.0

Facebook让人困惑。您需要的令牌取决于您想要实现的操作。例如,

  • 你使用你的应用令牌请求一个具有特定的用户令牌权限。
  • 然后您将使用该USER代表用户访问facebook api的TOKEN

在你发布的代码中,似乎你有你发送给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);

所以现在要检索访问令牌的用户,你会检索它(在回调函数/url从facebook)像这样:

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();
    ....
}