【问题标题】:How does Oauth2 (Bearer token) work when getting access_token获取access_token时Oauth2(Bearer token)如何工作
【发布时间】:2020-04-10 21:43:34
【问题描述】:

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

发生的情况是,您将拥有两个 api,其中一个是 post 和 get

  • POST 是你传递的地方

    curl -X POST "http://127.0.0.1:8000/token" -H "accept: application/json" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=&username=hello&password=world&scope=&client_id =&client_secret="

  • GET是需要access_token Bearer才能访问API等的apihttp://127.0.0.1:8000/getUser

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

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

【问题讨论】:

    标签: security oauth-2.0 bearer-token


    【解决方案1】:

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

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

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

    2. 如果您代表人类用户使用 OAuth2.0,您将使用“授权码”或“密码凭据”授权类型,用户将手动输入用户名密码

    3. 如果您代表客户端本身(而非人类用户)使用 OAuth2.0,则应使用“客户端凭据”授权类型

    所有这些授权类型都有不同的流程。既然您提到了硬编码,我假设您指的是第 1 点中提到的用例。 3. 硬编码机密绝不是一种选择。处理此问题的最安全方法是将机密存储在 Vault 中。一个不太安全的选择是以加密形式将秘密存储在单独的文件中。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-10
      • 2021-04-10
      • 2015-12-31
      • 2015-08-10
      • 2019-03-25
      • 2018-03-10
      • 2018-01-07
      • 2014-01-02
      相关资源
      最近更新 更多