django - 一个人应该吃多少狗粮? -内部和外部RestAPI和Oauth2

标签 django api rest angularjs oauth-2.0

TL; DR-跳过标记为的部分尽管有些上下文可能有用,但问题仍然存在。

一些背景

因此,我一直在网上寻找有关我将内部API内翻并开放给开发人员使用的一些问题的答案。我们的API已在生产中,并且当前需要使用标准会话进行保护。

现在,我已经确信用狗食自己的api是个好主意,因此我们可以跳过这一部分。我的问题与获取内部数据并使其在外部安全有关,请输入OAuth2。

在前端,我们是一个angular.js应用程序,分布在网站的多个部分,我认为它很重要,我强调它不是一页应用程序。在后端,我们使用django和其他使用django-rest-framework构建的api。我不认为后端的细节真的很重要,但是django确实可以将其中的一些页面渲染出来。这意味着在某些情况下,Angular会预先传递数据,而不是向api请求所有内容。这也有助于我们使网站的某些部分对SEO更加友好。呈现页面并将所需的任何初始数据传递到angular之后,所有内容就是angular.js-> api

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

一些推理

我已经从头到尾阅读了几乎全部的OAuth2规范,阅读了我在网上可以找到的每篇文章,甚至还买了一本关于该主题的书,而我只缺少其中一部分,这是一个至关重要的例子我想用OAuth替换我们的Web平台上当前的身份验证的实现。

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

我们已经开始将API从主要的Django api(现在用flask编写)中分离出来,因此向该api添加oauth将是很自然的一步。我们显然不能给角形钥匙,所以我们还剩下什么呢?

问题

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

我们默认是HTTPS

  • 用户登录(资源所有者密码流)后,是否安全,可以很好地复制我们网站的当前功能,因此可以直接使用该令牌。令牌可以保存在django中,并在需要时简单地传递给angular js应用程序。
  • 在django和api之间是否需要某种代理?这将使HTTP请求加倍,尽管在本地网络上可能还不错?
  • 是否可以使用隐式授予流完全用角度来处理它?据我了解,用户令牌已过期,只要用户仍使用身份验证服务器登录,angular即可异步请求另一个令牌以
  • 发出请求
  • 当用户来到我们的网站时,整个OAuth流应该对他们透明。这使客户凭证看起来很吸引人吗?尽管似乎确实存在一些安全隐患,允许网站仅使用client_id和client_secret访问所有内容,但是也许可以结合使用这种流程和可能有效的api代理吗?
  • 这是大个子们做的吗? Facebook,Twitter等?

  • 老实说,以上似乎都不是一个不错的选择。这将对整个行业产生可怕的影响,我无法想象在开发中使用这些选项会带来多大的痛苦。我的意思是,这是个好主意吗?有什么更简单的方法我只是忽略了。

    规范始终会为您信任第一方应用程序(例如移动客户端)的情况提供解决方案,但老实说,我只是对第一方实际上是网站的情况没有想到任何启发。

    我感谢花时间阅读本文的任何人。正如我提到的,我已经阅读了在这些主题上可以找到的所有内容,并且大多数内容都是基于-我应该使用自己的api还是应该使用单点登录?我所寻找的是关于在实际意义上实际实施这些事情的信息,并希望对那些在生产中实现此目标的人有一些智慧。

    感谢您抽时间阅读。

    最佳答案

    我已经考虑了一段时间-我目前正在构建一个可访问内置节点REST API的角度应用程序。与REST保持一致,我不应该维护会话,而应该在每个请求中传递一些用户/密码详细信息。

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

  • 用户访问角度应用程序。由于他们尚未登录,因此将为他们提供一个登录页面,供他们选择使用google / facebook登录。
  • 假设他们单击以使用google登录,该链接会将请求发送到我的节点服务器,并通过将用户重定向到google登录页面来启动google授权流程。
  • 他们可以访问应用程序/登录-然后重定向回节点服务器,该节点服务器从Google获取oauth2令牌。然后,节点服务器为特定用户存储此令牌。
  • 最后,节点服务器连同标头中的令牌一起重定向回到有角度的应用程序。此令牌存储在浏览器会话中,并在应用程序发出api请求时使用。如果api请求收到一个有效的令牌,它将以实物形式响应,否则它将传递一个错误,Angular应用会对此进行记录,并通过某种相关的错误通知重定向到登录页面。

  • 如果您要向第三方开放API,则可能需要做更多的工作,但这并不是我目前考虑的太多。

    关于django - 一个人应该吃多少狗粮? -内部和外部RestAPI和Oauth2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18585604/

    相关文章:

    mysql - 如何根据自动增量 id 字段在 django 中降序排列查询集顺序

    javascript - meetup api 请求 open_events

    java - 如何使用 Exchangeratesapi.io 和 okhttp 更改汇率基础货币,并在微调器中选择所有基础货币?

    javascript - 通过 REST API 进行用户身份验证

    rest - 使用自签名证书和基本身份验证的Powershell Invoke-RestMethod-是否有示例?

    python - Site.domain不断更改为localhost :8000 all the time

    django - 有没有办法隐藏从 Wagtail 管理页面树创建的 URL 的一部分?

    django - 查询速度反转 OneToOneField

    c++ - WPARAM 和 LPARAM 参数

    java - 如何在 linux 上从 rest 服务执行 sh 文件