繁体   English   中英

使用OAuth进行移动和使用我自己的API的网站的正确方法是什么?

[英]What is the correct way to use OAuth for mobile and website consuming my own API?

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

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

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

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

编辑

只是为了澄清,因为我发现很多讲座和文章从API消费者的角度来解释这个过程(即第三方开发者):我是API所有者和auth服务器所有者,我是所有者用户帐户(他们是我服务的用户),我也是我自己的消费者(虽然是网站和移动应用程序),并且将来我想让第三方开发者允许我的用户登录他们对我服务的描述(有点像Facebook或谷歌)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM