将 OAuth 用于使用我自己的 API 的移动设备和网站的正确方法是什么?

dev*_*r82 6 authentication oauth oauth-2.0 identityserver4

我有一个与 OAuth 2 的工作方式更相关的问题,但由于使用 IdentityServer 来实现 OAuth,我认为它是相关的。我在任何地方都找不到答案。

我正在构建一个网站和一个使用我自己的 API 的移动应用程序。我的应用程序的每个用户都会有一个用户名和密码,这将使他能够访问应用程序/网站,并通过 API 访问他的信息。

我不确定处理用户登录流程的正确方法:

  1. 在网站上我有自己设计的登录表单。我不想将用户移至我的身份验证服务器进行登录,然后让他批准他提供的信息 - 他是我系统上的用户 - 我可以访问所有信息 - 像 facebook 这样的kida 可以登录并访问信息——他们不会问你愿意给他们什么。那么隐式真的是解决这个问题的方法吗?
  2. 在移动应用程序上,我还有一个登录表单,现在我在这里读到(https://datatracker.ietf.org/doc/html/draft-ietf-oauth-native-apps-10)OAuth方法是在 WebView 中登录?Facebook 登录看起来不像是在其移动应用程序的 WebView 中。
  3. 我首先想到的方法是资源所有者。用户将登录、获取令牌和刷新令牌,然后可以开始使用我的 API。但是将我的 client_id 和密钥存储在移动应用程序上?在网站上的 javascript 文件上?感觉不对。我当然可以调用一个 API,该 API 将屏蔽这些内容并成为登录过程的代理……但是……(请阅读#4)。
  4. 将来我希望允许第三方开发者访问。为了让他们允许我的系统的用户登录,我将使用隐式流程。此外,我计划对这些开发者帐户进行受限的 API 访问(例如,对 API 的调用次数将受到计划的限制)。是什么阻止了这些开发人员在他们的网站上询问我系统上的帐户的用户名和密码,使用访问令牌和刷新令牌从我的服务器获取响应,并不受限制地使用我的 API,并有权访问整个用户资料?
  5. 假设我坚持资源所有者流程,从服务器接收一个令牌和一个刷新令牌。我应该在移动设备上存储什么以及如何存储?浏览器中应该存储什么以及如何存储?刷新令牌?每次他打开应用程序时都会使用该刷新令牌获取新的更新令牌?

编辑

只是为了澄清,因为我发现很多讲座和文章从 API 消费者的角度(即第三方开发人员)解释了该过程:我是 API 所有者和身份验证服务器所有者,我是所有者用户帐户(他们是我的服务的用户),我也是我自己的消费者(通过网站和移动应用程序),并且将来我希望第三方开发人员能够允许我的用户登录他们的我的服务帐户(有点像 Facebook 或 Google)

mor*_*tzg 0

你是对的,你不应该将 存储client_secret在你的应用程序中,但我怀疑你会绕过存储client_id. 您也可以禁用应用程序的同意屏幕,并构建本机登录视图。如果您不希望用户每次使用您的应用程序时都登录,您需要将access_token和存储在设备上(可能在数据库中加密)。refresh_token

对于问题4,您可以执行以下操作:

  1. 将其嵌入client_secret您的(网络)应用程序中
  2. 设置哪些主机可以访问 IdentityServer 上的 api
  3. IdentityServer生成salt并将其发送给客户端
  4. 客户端计算session_secret使用hash(ip_address + session_salt)
  5. 客户端使用session_secretclient_secret进行 API 调用
  6. 服务器验证hashclient_secret

完全阻止某人使用您的 API 几乎是不可能的。但是你应该添加各种速率限制方法,例如限制IP地址、API调用等。但是没有什么可以阻止有人反编译你的应用程序并访问你的client_id.