对于从 API 中提取的 AngularJS 安全站点,我应该使用啥 oAuth2 Grant
Posted
技术标签:
【中文标题】对于从 API 中提取的 AngularJS 安全站点,我应该使用啥 oAuth2 Grant【英文标题】:What oAuth2 Grant should I use for AngularJS secure site that pulls from an API对于从 API 中提取的 AngularJS 安全站点,我应该使用什么 oAuth2 Grant 【发布时间】:2014-11-06 15:49:11 【问题描述】:我正在寻找有关此项目最佳策略的建议。
我正在构建一个 SaaS 服务,其中客户(租户)可能能够使用 iPad 应用程序或服务网站访问该服务。服务网站将使用 AngularJS 和 laravel 编写。授权是oAuth 2。登录网站的用户将具有不同的角色和不同的能力。将来我们可能会扩展服务和应用程序,所有这些都使用相同的用户帐户。
我在为服务网站制定良好的身份验证和授权策略时遇到问题。由于该网站将运行 AngularJS 并将连接到我们自己的服务 API,我不确定为用户和 AngularJS 处理 AUTH 的最佳方法是什么。我知道 iPad 应用程序可能会使用“资源所有者授予”之类的东西,但是 AngularJS 网站和代码呢?它应该使用“隐式授予”、“JWT”还是其他什么?当用户登录时,是否应该给他们一个授权 AngularJS 网站上所有页面的 TOKEN?如果是这样,我是否使用“授权码授予”之类的东西并自动授权请求而不为用户做某种重定向?
我也在考虑使用“login.php”页面来授权用户并提供令牌。它可以在“angularjs”页面上嵌入用户配置文件,如果 AngularJS 页面没有嵌入配置文件,它会重定向到登录。但有了这个解决方案,我仍在尝试找出如何最好地安全地将 AngularJS 页面连接到 API。
我很困惑,因为 AngularJS 网站或多或少是我们 API 的接口。但我不认为用户应该通过“请求身份验证”过程,他们应该登录..
感谢您的任何建议或指导。-约翰
【问题讨论】:
【参考方案1】:许多人(lucadegasperi 的 oauth2-server-laravel 等)认为隐式授权类型是 OAuth2 授权类型中最不安全的,因此我建议您将 JWT 用于您的服务网站。
要将 JWT 与 Laravel 集成,请查看以下库。它工作得很好,并且还得到了流行的开箱即用 API 包 Dingo for Laravel (https://github.com/dingo/api) 的支持:
https://github.com/tymondesigns/jwt-auth对于应用程序,如果应用程序是第一方应用程序,请按照 Florens Morselli 所述进行 OAuth2 密码授权。如果是第三方应用,请改用授权码授权。
【讨论】:
【参考方案2】:对于您的服务网站,您应该使用隐式授权类型。此授权类型针对浏览器中的脚本进行了优化,AngularJS 旨在发送 API 请求(参见 http 和资源模块)。
您的 iPad 应用可以使用授权码授予类型或资源所有者密码凭据授予类型。
但不要忘记 OAuth2 是一种授权协议,而不是身份验证协议。如果您想使用 OAuth2 对用户进行身份验证,我建议您实现 OpenID Connect (http://openid.net/connect/)。实际上,身份验证是使用存储在 cookie 或本地存储中的 JWT 完成的。
您应该查看以下页面; Google 使用相同的协议来验证用户和授权的 API 调用:
https://developers.google.com/accounts/docs/OAuth2Login https://developers.google.com/accounts/cookbook/technologies/OpenID-Connect【讨论】:
【参考方案3】:如果您正在寻找在 AngularJS 中使用的 OAuth 2.0 模块,您可能想看看这个,我过去使用过它并且非常好:http://andreareginato.github.io/oauth-ng/
【讨论】:
以上是关于对于从 API 中提取的 AngularJS 安全站点,我应该使用啥 oAuth2 Grant的主要内容,如果未能解决你的问题,请参考以下文章
如何从Angularjs CacheFactory中提取响 应体
使用 angularJS 从存储在 Eclipse 项目类路径中的 .properties 文件中提取值
如何在 AngularJS 中正确使用 HTTP.GET?具体来说,对于外部 API 调用?