WEB API 2:在 oauth RegisterExternal (facebook) 期间获取配置文件数据

2024-01-11

在新用户调用后,开箱即用的 ASP.NET WEB API oAuth 实现:

GET api/Account/ExternalLogins?returnUrl=%2F&generateState=true

用户被重定向到外部登录(在我的例子中是 Facebook),从而产生一个用于注册的令牌(开箱即用的代码如下)

        // POST api/Account/RegisterExternal
        [OverrideAuthentication]
        [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
        [Route("RegisterExternal")]
        public async Task<IHttpActionResult> RegisterExternal([FromBody]RegisterExternalBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);

            if (externalLogin == null)
            {
                return InternalServerError();
            }

            IdentityUser user = new IdentityUser
            {
                UserName = model.UserName
            };
            user.Logins.Add(new IdentityUserLogin
            {
                LoginProvider = externalLogin.LoginProvider,
                ProviderKey = externalLogin.ProviderKey
            });
            IdentityResult result = await UserManager.CreateAsync(user);
            IHttpActionResult errorResult = GetErrorResult(result);

            if (errorResult != null)
            {
                return errorResult;
            }

            return Ok();
        }

在 RegisterExternal 期间,我想使用 Facebook 上的数据填充另一个数据库(名字、姓氏、电子邮件、朋友、分机号..)

我在注册过程中获得的不记名令牌可以not简单地这样称呼:

var accessToken = "token from header";
var client = new FacebookClient(accessToken);

因此,据我了解,我需要使用此数据的声明来修改 Startup.Auth,就像我通过添加以下内容所做的那样:

        var facebookProvider = new FacebookAuthenticationProvider()
        {
            OnAuthenticated = (context) =>
            {
                // Add the email id to the claim
                context.Identity.AddClaim(new Claim(ClaimTypes.Email, context.Email));
                return Task.FromResult(0);
            }
        };
        var options = new FacebookAuthenticationOptions()
        {
            AppId = "xxxxxxxxxxxxxxxxx",
            AppSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            Provider = facebookProvider
        };
        options.Scope.Add("email");
        options.Scope.Add("user_friends");
        options.Scope.Add("public_profile");
        app.UseFacebookAuthentication(options);

但是我该如何在 RegisterExternal 方法中获取该数据呢?


我也有同样的问题(我认为)——问题是 FB OAuth 基础设施只填充了基本数据,而我想要更多。

在深入研究 ASP.NET 身份的源代码后,我得到了以下结果:

app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
    AppId = "",
    AppSecret = "",
    Scope = { "public_profile", "email", "user_birthday", "user_location" },
    Provider = new FacebookAuthProvider(),
    UserInformationEndpoint = "https://graph.facebook.com/v2.5/me?fields=id,name,email,first_name,last_name,location,birthday,picture",
});

这里重要的部分是自定义提供者:

private class FacebookAuthProvider : FacebookAuthenticationProvider
{
    /// <summary>
    /// Invoked whenever Facebook succesfully authenticates a user
    /// </summary>
    /// <param name="context">Contains information about the login session as well as the user <see cref="T:System.Security.Claims.ClaimsIdentity" />.</param>
    /// <returns>A <see cref="T:System.Threading.Tasks.Task" /> representing the completed operation.</returns>
    public override Task Authenticated(FacebookAuthenticatedContext context)
    {
        TryParseProperty(context, "first_name", Claims.FirstName);
        TryParseProperty(context, "last_name", Claims.LastName);
        TryParseProperty(context, "picture.data.url", Claims.PhotoUrl);

        return base.Authenticated(context);
    }

    private void TryParseProperty(FacebookAuthenticatedContext context, string name, string targetName)
    {
        var value = context.User.SelectToken(name);
        if (value != null)
        {
            context.Identity.AddClaim(targetName, value.ToString());
        }
    }

}

这基本上将所有数据放入索赔中,并且可以以相同的方式在其他任何地方检索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WEB API 2:在 oauth RegisterExternal (facebook) 期间获取配置文件数据 的相关文章

随机推荐