如何在 angularjs 应用程序中实现安全(!)身份验证系统?

     2023-03-10     111

关键词:

【中文标题】如何在 angularjs 应用程序中实现安全(!)身份验证系统?【英文标题】:How to achieve a Safe (!) authentication system in an angularjs app? 【发布时间】:2013-01-25 07:52:29 【问题描述】:

我是 angularjs 新手...

我阅读了文档,并完成了教程;我自己也尝试了其他东西,事情开始对我有意义。

现在我想知道如何制作一个安全的身份验证系统

简单的部分:没有代码,我将描述我的代码执行的操作:

我有一个经典的表单:用户名和密码文本输入。

用户填写表单,然后按 ENTER。

一个 ajax 请求开始,响应是一个 JSON 告诉我 诸如“好吧,我认识你”或“我不知道你是谁”之类的。

我现在需要的是在我的应用程序的不同视图之间维护访问者的登录状态(或未登录)。

我在网上看到,为了实现这个目标,有人设置了一个变量($scope.isLogged = true),有人使用了 cookie;但是可以使用 firebug 或类似的开发工具轻松编辑 javascript 变量和 cookie。

...最后是问题:

那么,您对在 angularjs 应用中实现安全的身份验证系统有什么建议吗?

【问题讨论】:

【参考方案1】:

首先:客户端数据总是可以被操纵或篡改。

只要有效的会话 ID 不容易被猜到,并且像将会话令牌与客户端的 IP 相关联这样的措施,这没什么大不了的。

理论上,您也可以加密 cookie,只要您在服务器端这样做。

有关如何加密 cookie 的详细信息,请参阅服务器端的文档(例如,http://expressjs.com/api.html#res.cookie 用于 Express.js)

【讨论】:

首先感谢您的回答!按照您的建议进行,每次视图更改时,我都必须执行 ajax 请求以检查存储在变量/cookie 中的会话密钥是否与身份验证时生成的相同......我对吗?还是我错过了一些东西? 基本上,对于每一个需要用户认证的HTTP请求,服务器都会在请求到来时检查会话密钥。如果会话密钥不正确,服务器可以返回一个' 401 not authorized'而不是客户想要的数据。【参考方案2】:

你不能在 angularjs 中授权任何东西,因为用户可以完全控制执行环境(即浏览器)。每张支票,每一个案例,如果——任何你能想到的——都可以被篡改。有一些 javascript 库使用非对称密钥来执行本地加密以在一定程度上安全地存储本地数据,但它们并不是您真正想要的。

你可以而且你应该在服务器上授权——这是你在普通应用程序中执行的标准方式——使用会话;不需要特殊代码,ajax 调用使用普通会话 cookie。应用程序不需要知道它是否经过身份验证。它只需要检查服务器的想法。

从您的 angularjs 应用程序的角度来看,“登录”或“注销”只是用户的 gui 提示。

【讨论】:

+1,特别是对于“从您的 angularjs 应用程序的角度来看,“登录”或“注销”只是用户的 gui 提示。”如果用户想要篡改他们的执行环境,让 Angular 认为他们已经登录,那就这样吧——只要服务器仍然验证任何更改实际数据的操作等。 您好,谢谢。我对你的回答很感兴趣。特别是在你提到会话的部分,因为这是我工作的传统方式......我使用 PHP 作为服务器端语言......只是另一个问题(我现在没有时间亲自尝试,但我会尽快做[独立于你的回答,我保证:)]):如果在 ajax 请求期间设置一个会话,那么这个会话在下一个请求中仍然可用,对吗? @JamesEmerton:那是因为它与问题完全无关。 CSRF 保护与 angularjs 完全无关。出于同样的原因,我没有提到 SQL 注入、会话固定等——它们没有添加任何特定于角度的东西。 @fdreger 我不同意;问题是关于安全 身份验证系统。人们将 SO 用作学习资源,重要的是至少指出最相关的陷阱。 @JamesEmerton Web 应用程序安全性(包括身份验证及其陷阱)是一个庞大的主题,不可能在一个答案中详细涵盖。 SO 格式并不是要提供最完整的信息。相反:SO 的优势在于对具体问题给出具体答案。相关性是关键。如果您真的说添加有关 CSRF 的内容很重要,那么您为什么不提及正确的密码散列?防止 HTML 注入?反对会话固定?为什么包括 CSRF 而不是 SQL 注入?【参考方案3】:

您可能找到了解决方案,但目前我制定了一个正在我的 Angular 应用程序中实施的身份验证方案。

在 .run 上,应用注册时 ActiveSession 设置为 false。 然后它会检查浏览器是否有一个带有令牌和用户 ID 的 cookie。

如果是,检查服务器上的 token+userId 并更新服务器和本地的令牌(令牌是服务器生成的每个用户唯一的密钥)

如果 NO 显示登录表单,请检查凭据,如果它们有效,服务器会再次请求获取新令牌并保存在本地。

令牌用于进行持久登录(记住我 3 周)或当用户刷新浏览器页面时。

谢谢

【讨论】:

加一个用于认真对待问题,即使它来自您不认识的人【参考方案4】:

我三个月前问过这个问题。

当我必须在基于 AngularJS 构建的网络应用中处理用户身份验证时,我想分享我最喜欢的方法。

当然,fdreger 的回答还是很好的回答!

你不能在 angularjs 中授权任何东西,因为用户有完整的 执行环境(即浏览器)的控制。

从您的 angularjs 应用程序的角度来看,正在“登录” 或“注销”只是用户的 gui 提示。

所以,简而言之,我的方法包括:

1) 为每个路由绑定关于路由本身的附加信息。

$routeProvider.when('/login',  
    templateUrl: 'partials/login.html', controller: 'loginCtrl', isFree: true
);

2) 使用服务来维护有关每个用户的数据及其身份验证状态。

services.factory('User', [function() 
    return 
        isLogged: false,
        username: ''
    ;
]);

3) 每次用户尝试访问新路由时,检查他们是否有访问权限。

$root.$on('$routeChangeStart', function(event, currRoute, prevRoute)
    // prevRoute.isFree tell me if this route is available for all the users, or only for registered user.
    // User.isLogged tell me if the user is logged
)

我还在我的博客users authentication with angularjs 上写过这种方法(更详细)。

【讨论】:

【参考方案5】:

你需要了解它的服务器端/数据库端。

用户登录信息需要存储在某个地方 - 99.9% 的时间都存储在服务器端数据库中。

理想情况下,对于真正安全的系统,您需要一个后端(服务器端)成员系统,该系统将会话存储在与包含加密密码的成员表相关的数据库表中,但还提供一个 RESTful 接口,您可以在其中构建你的 api 调用。

我成功使用的一个脚本是成员https://www.amember.com/。尽管还有很多其他脚本,但这是一种非常经济有效的方式,我在这个方面取得了很大的成功。它也是 PHP,所以你可以为你的 Angular http 调用构建一个 API很容易。

所有这些 javascript 框架都很棒,但效果是现在太多人过于关注事物的前端——同时学习数据库/后端! :-)

【讨论】:

如何在AngularJS中实现带有输入字段的模板组件

】如何在AngularJS中实现带有输入字段的模板组件【英文标题】:HowtorealizetemplatecomponentwithinputfieldinAngularJS【发布时间】:2020-01-2920:28:14【问题描述】:我们在项目中使用AngularJS1.6和bootstrap4.3.1来构建UI。现在我想构建一个简单的... 查看详情

如何在 Flutter 中实现音频流应用和安全存储

...google.com/store/apps/details?id=deezer.android.app构建像deezer这样的应用程序,因为我有2个问题。是否有 查看详情

如何在 AngularJS 中实现 websockets?

】如何在AngularJS中实现websockets?【英文标题】:HowtoimplementwebsocketsinAngularJS?【发布时间】:2016-03-1809:53:42【问题描述】:我想创建一个AngularJS站点,该站点通过来自服务器的websockets更新其信息。服务器将每秒发出一个新的信息... 查看详情

如何在angularjs中实现导航栏

】如何在angularjs中实现导航栏【英文标题】:Howtoimplementanavigationbarinangularjs【发布时间】:2013-08-2520:23:36【问题描述】:从angularjs作为新手开始,我创建了一个导航栏。它有几个子菜单。但我不完全确定使用angularjs处理它的最佳... 查看详情

如何在 Spring MVC 应用程序中实现 Spring 安全性?

】如何在SpringMVC应用程序中实现Spring安全性?【英文标题】:HowtoImplementSpringsecurityinSpringMVCapplication?【发布时间】:2019-07-0518:03:22【问题描述】:我是Spring安全的新手。我已经实现了SpringSecurity并生成了JWT令牌。现在我需要从令... 查看详情

如何在 Struts 1 中实现 Spring 安全性(不在 struts 2 中)

...间】:2016-07-0501:30:41【问题描述】:我正在开发企业级Web应用程序,其中安全性应该是一流的。那么,有人可以建议我如何在struts1应用程序中实现spring的安全性。我是Spring新手,但我很了解Struts。如果有适当的 查看详情

如何在 Web 表单中实现 AngularJS 控制器?

】如何在Web表单中实现AngularJS控制器?【英文标题】:HowtoimplementanAngularJScontrollerinawebform?【发布时间】:2013-09-2604:29:07【问题描述】:我有一个AngularJS控制器,我想在我的MVC网络表单视图页面中使用它。我创建了一个简单的代... 查看详情

如何在 AngularJS 中实现组件组合(类似于 React 渲染道具模式)?

】如何在AngularJS中实现组件组合(类似于React渲染道具模式)?【英文标题】:HowcanIachievecomponentcompositioninAngularJS(similartoReactrenderpropspattern)?【发布时间】:2019-05-2608:18:24【问题描述】:我正在尝试在AngularJS中创建一个网格组件... 查看详情

如何在微服务架构中实现基于角色的安全性

...有4个微服务、eureka服务器和一个集中式API网关的spring-boot应用程序。所有外部流量都通过我的API网关到达我的微服务。我的API网关(Zuul)正在验证和验证J 查看详情

如何在 MVC 的文件夹中实现没有 NuGet 的 angularJS

】如何在MVC的文件夹中实现没有NuGet的angularJS【英文标题】:HowcanIimplementangularJSwithoutNuGetinafolderinMVC【发布时间】:2021-10-0305:33:41【问题描述】:我有一个名为angularJS的新文件夹,如果不使用NuGet包,我不知道如何实现它。【问... 查看详情

如何使用php json数组在带有angularjs的cordova中实现推送通知

】如何使用phpjson数组在带有angularjs的cordova中实现推送通知【英文标题】:Howtoimplementpushnotificationincordovawithangularjsusingphpjsonarray【发布时间】:2016-05-2304:17:18【问题描述】:我有一个项目,我需要在服务器端使用PHP为CordovaAngularJS... 查看详情

如何在 C# 中实现 Base64 URL 安全编码?

】如何在C#中实现Base64URL安全编码?【英文标题】:HowtoachieveBase64URLsafeencodinginC#?【发布时间】:2014-12-0819:52:09【问题描述】:我想在C#中实现Base64URL安全编码。在Java中,我们有一个通用的Codec库,它为我提供了一个URL安全编码字... 查看详情

如何在火花聚合函数中实现scala类型安全

】如何在火花聚合函数中实现scala类型安全【英文标题】:Howtoimplementscalatypesafetyinsidesparkaggregationfunction【发布时间】:2021-09-1322:34:45【问题描述】:如何对agg函数中聚合的值实现类型安全?我的目标是在运行前进行类型检查。$&... 查看详情

如何在 Flutter 中实现应用内购买订阅?

】如何在Flutter中实现应用内购买订阅?【英文标题】:HowtoimplementIn-AppPurchasesSubscriptioninFlutter?【发布时间】:2019-05-2115:59:57【问题描述】:我想在我的Flutter应用中为iOS和Android设备提供自动续订订阅。用户可以订阅1个月。目前... 查看详情

java示例代码_如何在Java中实现安全的静态登录凭据系统

java示例代码_如何在Java中实现安全的静态登录凭据系统 查看详情

如何在 IBM Worklight 6.0 中实现 OAUTH 2.0

...ght6.0【发布时间】:2013-08-2607:30:26【问题描述】:在我的应用程序中,我通过实现安全领域实现了登录模块身份验证安全性。但我正在考虑实施OAUTH2.0身份验证,一旦我获得令牌并重新验证,用户将在应用程序启动时进行身份验... 查看详情

在 AngularJS 指令中实现继承

】在AngularJS指令中实现继承【英文标题】:ImplementinginheritanceinAngularJSdirectives【发布时间】:2013-10-1020:37:01【问题描述】:我正在尝试在AngularJS指令中实现OOP继承,以制作可重用的控件。我使用Base2\'sClassdefinition进行继承。我的... 查看详情

如何在angular js中实现多路由

】如何在angularjs中实现多路由【英文标题】:Howtoachievemultipleroutinginangularjs【发布时间】:2018-11-2223:10:07【问题描述】:我在AngularJS中练习routing。到目前为止,我已经研究了2页路由,但现在我想实现3页路由。(function()\'usestrict\';... 查看详情