一个人应该吃多少狗粮? - 内部和外部RestAPI&的oauth2

时间:2013-09-03 06:31:16

标签: django api rest angularjs oauth-2.0

TL; DR - 跳过标有问题的部分,尽管某些上下文可能有用。

一些背景

所以我一直在寻找网络寻找一些问题的答案,这些问题涉及到内部API的内部开放以及开放供开发人员使用。我们的API已经投入生产,目前在需要时使用标准会话进行保护。

现在我已经确信狗吃自己的api是一个好主意,所以我们可以跳过这部分。我的问题非常关注内部和外部安全,输入OAuth2。

在前端,我们是一个angular.js应用程序分布在网站的几个部分,我认为重要的是我强调它不是一个单页的应用程序。在后端,我们使用django-rest-framework构建了其余api的django。我不认为后端的细节非常重要,但绝对值得注意的是django渲染了一些这些页面。这意味着在某些情况下,angular会预先传递数据,而不是从api请求所有内容。这也有助于我们使网站的某些部分更加SEO友好。一旦页面被渲染并且所需的任何初始数据已经传递给角度,一切都是angular.js - > API

在我真正了解问题的最后之前提到的最后一个细节是,api目前有一些公共端点,前端公开的内容是定义的,可以从api公开获得,尽管这很可能我们想要改变的东西。

一些推理

我已经多次从头到尾阅读了OAuth2规范(差不多),我已经阅读了我在网上找到的每篇文章,我甚至买了一本关于这个主题的书,而且只有一部分遗失给我,一个关键的例子这将有助于我实现用OAuth替换我们在Web平台上的当前身份验证。

如果我们要向第三方提供API,OAuth2似乎是目前唯一的声音选择。喂食api的狗只会改善它。所以我们自己留下了Needing Access令牌。这是我无法做出决定的地方。

我们已经开始将API从主Django api(现在用烧瓶编写)中删除,所以在api中添加oauth将是一个非常自然的步骤。我们显然不能给键有角度,所以我们还剩下什么?

问题

我们可以用OAuth2替换基于会话的Auth。我们的内部api目前使用会话进行身份验证。如果我们为第三方提供API,我们如何为主要的Web平台实施OAuth?

我们默认为HTTPS

  • 是否安全,一旦用户登录(资源所有者密码流),这将很好地复制我们网站的当前功能,直接使用该令牌。令牌可以保存在django中,并在需要时简单地传递给角度js应用程序。

  • 我们需要django和api之间的某种代理吗?这会使http请求加倍,虽然它可能在本地网络上没那么糟糕?

  • 我们可以使用隐式授权流程完全使用angular处理吗?据我所知,当用户令牌过期时,只要用户仍然使用身份验证服务器登录,angular就可以异步请求另一个令牌来发出请求

  • 当用户访问我们的网站时,整个OAuth流程应该对他们透明。这使客户端凭据看起来很吸引人?是否可能有这个流程和api的一些代理组合可以工作,虽然这看起来有点安全风险,允许网站只使用client_id和client_secret访问所有内容?

  • 这是大家伙做的事吗? facebook,twitter等?

说实话,以上都不是一个很好的选择。它会对整个董事会产生可怕的影响,我无法想象在开发中使用这些选项会有多大的痛苦。我的意思是这是一个好主意吗?有没有什么方法我只是忽略了。

该规范始终暗示您可以信赖第一方应用程序(如移动客户端)的情况下的解决方案,但老实说,我对第一方实际上是第一方所考虑的任何事情都没有感到鼓舞。网站。

我感谢任何花时间阅读此内容的人。正如我所提到的,我已经阅读了我可以在这些主题上找到的所有内容,而且大多数是基于 - 我应该使用自己的api还是我们如何使用单点登录?我正在寻找的是实际意义上实际实现这些事物的信息,并希望为生产中完成这一事实的任何灵魂提供一些智慧珍珠。

感谢您花时间阅读本文。

1 个答案:

答案 0 :(得分:0)

我一直在考虑这个问题 - 我正在努力构建一个访问内置节点的REST API的角度应用程序。为了与REST保持一致,我不应该维护会话,而应该在每个请求中传递一些用户/密码详细信息。

现在很明显,许多API很乐意坚持使用某种基本授权或api密钥,从而避免使用oauth2,但我想用google / facebook登录,因此需要进行一定数量的令牌争用。我正在使用的具体流程是 -

  1. 用户访问角度应用程序。由于他们没有登录,他们将获得一个登录页面,可以选择使用google / facebook登录。

  2. 假设他们点击了google登录 - 该链接会向我的节点服务器发送请求,并通过将用户重定向到googles登录页面来启动Google授权流程。

  3. 他们可以访问应用程序/登录 - 然后重定向回节点服务器,后者从谷歌获取oauth2令牌。然后,节点服务器为特定用户存储此令牌。

  4. 最后,节点服务器将重定向回角度应用程序以及标头中的令牌。此令牌存储在浏览器会话中,并在应用程序发出api请求时使用。如果api请求收到一个有效的令牌,它会以实物形式响应,否则它会传递一个错误,而角度应用程序会注意到这一点,并通过某种相关的错误通知重定向到登录页面。

  5. 如果您要将API打开到第三方,您可能需要做更多的工作,但这不是我目前考虑得太多的东西。