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

标签 authentication oauth oauth-2.0 identityserver4

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

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

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

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

  • 编辑

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

    最佳答案

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

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

  • 嵌入 client_secret在您的(网络)应用程序中
  • 在 IdentityServer 上设置哪些主机可以访问您的 api
  • IdentityServer 生成一个 salt 并发送给客户端
  • 客户端计算出session_secret使用 hash(ip_address + session_salt)
  • 客户端使用 session_secretclient_secret用于 API 调用
  • 服务器验证 hashclient_secret

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

    关于authentication - 将 OAuth 用于使用我自己的 API 的移动设备和网站的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43689218/

    相关文章:

    asp.net - Web Api Asp.Net 身份

    c# - Asp.Net Core 3 Identity - 来自浏览器的 JWT 中不存在自定义声明

    java - Oauth "An Authentication object was not found in the SecurityContext"

    php - 如何使用存储的刷新 token 获取更新的访问 token

    asp.net-web-api - ASP.NET Web API - 经过身份验证的加密 JWT token - 我需要 OAuth 吗?

    node.js - 在 Express/Node Js 中验证基于微服务的 API 端点

    asp.net-mvc-3 - 在 ASP.NET MVC 中编码 returnUrl 查询字符串

    authentication - 来自已安装应用程序的 OpenID 身份验证

    ios - 是否可以使 iOS 上的 oauth 安全?

    php - 使用 Laravel Passport 获取经过身份验证的用户并授予密码