如何将Firebase启用为my Azure Active Directory应用程序的自定义身份验证提供程序?

如何将Firebase启用为my Azure Active Directory应用程序的自定义身份验证提供程序?,firebase,ionic-framework,firebase-authentication,azure-active-directory,Firebase,Ionic Framework,Firebase Authentication,Azure Active Directory,我正在用Ionic和Azure Active Directory开发一个应用程序,我想添加Firebase作为我的前端和后端身份验证提供商 Azure目前支持Microsoft、Facebook、Google和Twitter,他们还说你可以添加自己的提供商,但我只是不知道怎么做,我没有太多的经验 在这方面,一个分步指南可能会有很大帮助。要为移动后端添加自定义身份验证,我们需要实现一个ApiController来处理登录请求。下面是一个从数据库中删除用户的示例(完整代码示例参考此站点): 以下链接

我正在用Ionic和Azure Active Directory开发一个应用程序,我想添加Firebase作为我的前端和后端身份验证提供商

Azure目前支持Microsoft、Facebook、Google和Twitter,他们还说你可以添加自己的提供商,但我只是不知道怎么做,我没有太多的经验


在这方面,一个分步指南可能会有很大帮助。

要为移动后端添加自定义身份验证,我们需要实现一个
ApiController
来处理登录请求。下面是一个从数据库中删除用户的示例(完整代码示例参考此站点):

以下链接也有助于了解移动应用程序的自定义身份验证:


你能参考一下这篇文章吗?它说微软、Facebook、谷歌和Twitter都是受支持的?我只是想确定我知道你在说什么。你好@fei xue msft,谢谢你的回答,我有一个问题:AppServiceLoginHandler.CreateToken来自哪里,我可以在ionic应用程序中使用它吗?如果没有,我必须生成“AAD”的替代方案是什么来自客户端的令牌?
AppServiceLoginHandler.CreateToken
方法来自。当我们保护移动应用程序时,实际上我们保护了移动后端,我们不能像爱奥尼亚应用程序那样在客户端使用它。令牌总是从“服务器”发出,客户端使用它来请求资源。如果我误解了,请随时告诉我。我对此做了一些研究,无法使用您的代码,但有一个名为azure mobile apps的NodeJS库,我想我可以使用它生成令牌,对吗?你以前做过吗?@MoisesEliasValera你收到错误消息了吗?上面的代码是用C#开发的,对我来说效果很好。如果您使用node.js开发后端,那么大部分代码应该是相同的。您只需替换代码即可获得密钥并登录令牌。
using System;
using System.IdentityModel.Tokens;
using System.Linq;
using System.Security.Claims;
using System.Web.Http;
using Backend.Models;
using Microsoft.Azure.Mobile.Server.Login;
using Newtonsoft.Json;

namespace Backend.Controllers
{
    [Route(".auth/login/custom")]
    public class CustomAuthController : ApiController
    {
        private MobileServiceContext db;
        private string signingKey, audience, issuer;

        public CustomAuthController()
        {
            db = new MobileServiceContext();
            signingKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY");
            var website = Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME");
            audience = $"https://{website}/";
            issuer = $"https://{website}/";
        }

        [HttpPost]
        public IHttpActionResult Post([FromBody] User body)
        {
            if (body == null || body.Username == null || body.Password == null ||
                body.Username.Length == 0 || body.Password.Length == 0)
            {
                return BadRequest(); ;
            }

            if (!IsValidUser(body))
            {
                return Unauthorized();
            }

            var claims = new Claim[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, body.Username)
            };

            JwtSecurityToken token = AppServiceLoginHandler.CreateToken(
                claims, signingKey, audience, issuer, TimeSpan.FromDays(30));
            return Ok(new LoginResult()
            {
                AuthenticationToken = token.RawData,
                User = new LoginResultUser { UserId = body.Username }
            });
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool IsValidUser(User user)
        {
            return db.Users.Count(u => u.Username.Equals(user.Username) && u.Password.Equals(user.Password)) > 0;
        }
    }

    public class LoginResult
    {
        [JsonProperty(PropertyName = "authenticationToken")]
        public string AuthenticationToken { get; set; }

        [JsonProperty(PropertyName = "user")]
        public LoginResultUser User { get; set; }
    }

    public class LoginResultUser
    {
        [JsonProperty(PropertyName = "userId")]
        public string UserId { get; set; }
    }
}