如何实施 Angular.js中基于OpenID的身份验证(使用Flask后端Web应用程序)?
看起来Angular.js代码需要合并逻辑 例如found here.
但是,Flask方面也应该有一个OpenID验证机制
是否有一种“推荐”方式为后端和前端编写逻辑?
是否有github示例或其他一些相关的资源?
答案 0 :(得分:21)
不幸的是我没有要分享的示例应用程序,但这是一个我希望有用的高级描述。
让我们暂时忘记您有一个AngularJS应用程序并查看OpenID身份验证交换的工作原理:
因此,让我们看看当您将AngularJS添加到混合中时会发生什么。请注意,有很多方法可以做到这一点,我在下面描述的是一种可能性。
如果Angular应用程序向需要身份验证的服务器发出请求,则服务器应返回错误代码401.例如,当Angular应用程序获得401时,可以弹出登录表单。
但OpenID身份验证舞蹈不能在丰富的JS应用程序的上下文中完成,因为它需要浏览器重定向。您的服务器端应用程序必须至少支持三条路由:
因此,用户连接到您的根URL并获取AngularJS应用程序,该应用程序以非身份验证状态启动。在某些时候,Angular应用程序将使用具有OpenID文本字段和提交按钮的表单提示用户登录。这些表单字段应该是发布到服务器的常规HTML表单的一部分,而不是连接到控制器的客户端Angular元素。表单的“action”属性应指向服务器的OpenID登录路由。
当用户单击登录按钮时,服务器唤醒并接收启动OpenID身份验证的请求。此时,上面的步骤1-5运行没有变化。
在步骤5结束时,服务器已将用户定位在应用程序的数据库中。服务器现在可以做的是通过重定向回到根URL,以重新启动Angular应用程序。如果应用程序需要在非初始状态的状态下重新启动,则可以在启动OpenID身份验证过程之前将还原状态保存在客户端存储(例如cookie)中。
但这还不够,服务器还需要向Angular传递一些有关登录用户的信息。一种方法是将用户的唯一ID或令牌附加到重定向URL的查询字符串中, Angular app可以访问。这将是上面第6步中进入cookie的同一段ID。
现在Angular应用程序重新启动,可以在必要时恢复其状态,并具有标识登录用户的ID或令牌。当应用程序需要向服务器发出Ajax请求时,它会将此ID或令牌与请求一起发送。服务器可以验证它并返回401,如果发现它无效或者它有一个到期日期并且发现它已过期。
如果与请求一起发送的标识已经过验证,则可以执行请求并将响应发送回Angular应用程序。
只需删除用户ID /令牌,即可在客户端实现注销功能,以便将来发送到服务器的请求无需再进行身份验证。
非常重要:Angular应用程序和Flask服务器之间包含用户信息的所有交换必须通过安全HTTP完成。如果不是,您的身份证或代币将以纯文本形式旅行。