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

Posted

技术标签:

【中文标题】使用 Cordova 的 Azure 移动应用自定义身份验证【英文标题】:Azure mobile apps custom authentication with Cordova 【发布时间】:2016-11-05 06:49:22 【问题描述】:

我目前有一个使用 Azure 移动应用程序的应用程序的后端解决方案。我已启用 facebook、twitter、google 和 Microsoft 登录。除此之外,我还尝试添加自定义登录流程。我已经设置了一个 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 从我的前端应用程序访问表控制器?

编辑:好的,正如您将在下面的@AdrianHall 评论线程中看到的那样,我已经成功地从我的科尔多瓦应用程序中生成了一个令牌,但我的绊脚石现在让服务接受它没有 em> 必须交换代币。根据发布的指南,这是可能的。

这是我的客户端代码,它当前对 auth0 进行身份验证调用,并进行一些客户端设置以获取用户 ID 并生成包含新令牌的“当前用户”对象。

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

【问题讨论】:

感谢您的编辑。很遗憾您无法为赏金提供答案。 【参考方案1】:

在 Azure 移动应用 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 所需的配置。您只需要了解您的 Audience(JWT 中的 aud 字段)和 Issuer(JWT 中的 iss 字段)是什么。在 auth0 的情况下,Audience 是您的 ClientId,Issuer 是“https://your-domain-value” - Client Secret 是签名密钥

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

【讨论】:

哦,这个人自己真是太棒了。非常感谢你的博客——它对社区来说是一笔巨大的财富:)我明天会看看你所说的。感谢您的帮助。 还有一个问题 - 我应该从前端打什么电话到 azure 来授权? @anthonyhumphreys 见Add authentication to your Apache Cordova app。 我建议您改为在 Auth0 中启用 FB、Twitter 等 - 这允许您使用单个身份验证提供程序。 您需要进行自定义身份验证才能将 Auth0 令牌换成 ZUMO-AUTH 令牌。有关一般过程,请参阅此内容:adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/… - 您必须转换为 cordova 版本而不是 .NET 版本。

以上是关于使用 Cordova 的 Azure 移动应用自定义身份验证的主要内容,如果未能解决你的问题,请参考以下文章

403.60 - 使用 Azure 移动应用对 Cordova 进行身份验证时出现禁止错误

适用于 Cordova 的 Azure 移动服务/VS 工具 - 404

使用 Azure 将通知从 ASP.Net 页面推送到不同平台

在运行时使用自定义声明 Azure Active Directory

如何将推送通知从 Azure 发送到 Windows Mobile Cordova 应用程序

Cordova7.X系列视频教程-姜博-专题视频课程