获取access_token时Oauth2(承载者令牌)如何工作

时间:2019-12-18 10:45:28

标签: security oauth-2.0 bearer-token

首先,我将遵循如何使用FastAPI(https://fastapi.tiangolo.com/tutorial/security/oauth2-jwt/)制作安全API的指南。

发生的事情是,您将拥有两个api,其中一个是post并获取

  • POST是传递

    的地方

    卷曲-X POST“ http://127.0.0.1:8000/token” -H“接受:application / json” -H“内容类型:application / x-www-form-urlencoded” -d“ grant_type =&username = hello&password = world&scope =&client_id =&client_secret =“

  • GET是一个API,要求access_token承载者能够访问API等http://127.0.0.1:8000/getUser

现在,我对运行该应用程序的安全性感到非常困惑,因为令我感到困惑的是,我需要使用用户名和密码向API发出POST请求,这将使我返回access_token,并且我相信使用该access_token稍后我访问下一个api http://127.0.0.1:8000/getUser吗?这是正确的方法还是我超出范围?

因为让我感到不安全的是,如果我现在说我的用户名和密码“硬编码”到python脚本中,并且有人设法对脚本/ exe /进行全面工程设计(甚至可以通过网络查看以params /形式发送的内容/数据)-在这种情况下,他们将可以访问我的令牌。那么这里的建议是什么?

1 个答案:

答案 0 :(得分:1)

这是一个相当广泛的问题。一个很好的起点是OAuth2 RFC 6749。

第一步需要正确理解一些基本知识:

  1. OAuth2.0的前提条件是TLS。假设您将TLS 1.2或1.3与适当的密码套件一起使用,我们可以安全地假设不可能进行网络嗅探

  2. 如果您是代表人类用户使用OAuth2.0,则可以使用“授权代码”或“密码凭证”授予类型,以便用户手动输入用户名密码

    < / li>
  3. 如果您是代表客户端本身使用OAuth2.0(不是人类用户),则应使用“客户端凭据”授予类型

所有这些授予类型都有不同的流程。既然您已经提到了硬编码,那么我假设您是指第No点中提到的用例。 3.硬编码秘密绝不是一种选择。解决此问题的最安全方法是将机密存储在保险柜中。一种不太安全的选择是将机密以加密形式存储在单独的文件中。

我也建议您阅读以下答案:

https://stackoverflow.com/a/59433000/1235935

https://stackoverflow.com/a/54011649/1235935

https://stackoverflow.com/a/54258744/1235935

https://stackoverflow.com/a/59464645/1235935