【问题标题】:OAuth2 native apps - client secretOAuth2 本机应用程序 - 客户端密码
【发布时间】:2017-07-06 07:44:22
【问题描述】:

API 消费者订阅特定 API 门户上的 API。 他收到客户端 ID 和客户端密码。 订阅有一个特定的 quata 集。

[快乐一天情景]

  • 然后他决定创建一个 Web 应用程序并将客户端密码安全地放在服务器上。
  • 然后他决定使用 Auth 代码授权
  • 在收到用户的 auth_code 后,后续调用以获取 acces_token 将是带有客户端密码的服务器到服务器请求。
  • 因此,通过安全存储和使用 client_secret 解决了目的。

[不开心的一天场景]

  • 后来,他决定创建一个原生应用(公共客户端 - Android/IOS 应用),该应用使用他之前订阅的相同 API。
  • 要让原生应用访问 API,它需要 access_token。
  • 用户通过身份服务器进行身份验证并提供授权。
  • 接收 auth_code 并重定向回应用程序。
  • 然后应用程序将需要此 auth_code + 客户端 ID + client_secret 来获取 access_token。
  • 但在这种情况下,client_secret 没有安全存储。应用可以被反编译,client_secret 可以被滥用,代价是 API 消费者购买/订阅 API。

隐式流选项被排除。

可能的解决方法:

  • 创建一个存储 client_ID 和 client_secret 的代理,本机应用使用 auth_code 调用此代理以获得访问令牌。
  • 加密client_secret 请就更好和推荐的解决方案/模型提出建议。

【问题讨论】:

    标签: android oauth oauth-2.0 iso


    【解决方案1】:

    我找到了一种更好的方法来解决这个问题,方法是为本地可用的 /oauth2/authorize 端点创建一个 API。

    所以这是流程:

    1. 我的 API 将接受请求中的用户名、密码和客户端 ID
    2. API 将根据 DB 验证收到的 clientID
    3. 如果有效,则从 DB 中获取 clientID 的 client_secret
    4. 在运行时创建授权:基本 base64(clientID:client_secret) - 使用脚本拟合器
    5. 将此创建的授权标头添加到请求中
    6. 将此请求在本地转发到实际的 /oauth2/authorize 端点

    通过不将 client_secret 嵌入公共客户端(本机应用程序)中,这很完美,并且适合我在管理 API 网关时的情况:)

    注意:也适用于 auth_code 授权流程

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 2023-03-05
      • 2016-06-06
      相关资源
      最近更新 更多