使用Cordova的Azure移动应用自定义身份验证

本文关键字:应用 自定义 身份验证 移动 Azure Cordova 使用 | 更新日期: 2023-09-27 17:54:07

我目前有一个后端解决方案为我的应用程序使用Azure移动应用程序。我已经启用了facebook、twitter、谷歌和微软的登录功能。我试图添加一个自定义登录流除了这个。我已经设置了一个Auth0帐户和应用程序,当我使用Auth0锁定小部件在应用程序中发出请求时,我能够从Auth0获得令牌和配置文件。

我遵循本指南:https://shellmonger.com/2016/04/08/30-days-of-zumo-v2-azure-mobile-apps-day-5-custom-authentication/并进入"在服务器中自定义JWT验证"阶段,但这就是我被困的地方…我的后端是c#而不是node.js,所以我如何做等同于本教程和验证JWT令牌,然后从我的前端应用程序使用azureClient.login/azureClient.table访问表控制器?

编辑:好吧,正如你将在下面的评论线程中看到的,我已经成功地从我的cordova应用程序中生成了一个令牌,但我的绊脚石是现在让服务接受它而不需要交换令牌。根据张贴的指南,这是可能的。

这是我的客户端代码,目前使auth调用auth0,并做一些客户端设置,以获得一个userID,并生成'currentUser'对象包含新的令牌。

 auth0.lock.show(auth0.options, function(err, profile, token) {
    if (err) {
     console.error('Error authenticating with Auth0: ', err);
     alert(err);
    } else {
     debugger;
     var userID;
     if (profile.user_id.indexOf("auth0") > -1) {
      userID = profile.user_id.replace("auth0|", "");
     } else if (profile.user_id.indexOf("facebook") > -1) {
      userID = profile.user_id.replace("facebook|", "");
     } else if (profile.user_id.indexOf("twitter") > -1) {
      userID = profile.user_id.replace("twitter|", "");
     } else if (profile.user_id.indexOf("microsoft") > -1) {
      userID = profile.user_id.replace("microsoft|", "");
     } else if (profile.user_id.indexOf("google-oauth2") > -1) {
      userID = profile.user_id.replace("google-oauth2|", "");
     }
     window.azureClient.currentUser = {
      userId: userID,
      profile: profile,
      mobileServiceAuthenticationToken: token
     };
     //A client session has now been created which contains attributes relevant to the currently logged in user.
     console.log("window.azureClient.currentUser", window.azureClient.currentUser);
     window.localStorage.setItem("currentUser", JSON.stringify(window.azureClient.currentUser));
     //Call the get profile function which will call our API to get the user's activities and bio etc.
     getProfile();
    }

后端代码MobileAppSettingsDictionary

settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();
        if (string.IsNullOrEmpty(settings.HostName))
        {
            //This middleware is intended to be used locally for debugging.By default, HostName will
            //only have a value when running in an App Service application.
            app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
            {
                SigningKey = ConfigurationManager.AppSettings[""],
                ValidAudiences = new[] { ConfigurationManager.AppSettings[""] },
                ValidIssuers = new[] { ConfigurationManager.AppSettings["https://domain.eu.auth0.com/"] },
                TokenHandler = config.GetAppServiceTokenHandler()
             });
        }

使用Cordova的Azure移动应用自定义身份验证

在Azure Mobile Apps的c#后端,有一个App_Start'Startup.Mobile.cs文件,代码如下:

    MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();
    if (string.IsNullOrEmpty(settings.HostName))
    {
        // This middleware is intended to be used locally for debugging. By default, HostName will
        // only have a value when running in an App Service application.
        app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
        {
            SigningKey = ConfigurationManager.AppSettings["SigningKey"],
            ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
            ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
            TokenHandler = config.GetAppServiceTokenHandler()
        });
    }

app.UseAppServiceAuthentication调用设置解码JWT所需的配置。您只需要了解您的受众(JWT中的aud字段)和发布者(JWT中的iss字段)。在auth0的情况下,受众是您的客户端id,发行者是"https://your-domain-value" -客户端秘密是签名密钥

您可以在https://jwt.io上通过剪切和粘贴来验证示例JWT—这将显式地显示值应该是什么,并允许您验证签名。