Authentication 对于使用我自己的API的移动和网站,使用OAuth的正确方法是什么?

Authentication 对于使用我自己的API的移动和网站,使用OAuth的正确方法是什么?,authentication,oauth,oauth-2.0,identityserver4,Authentication,Oauth,Oauth 2.0,Identityserver4,我有一个问题与OAuth 2的工作方式更相关,但由于使用IdentityServer实现OAuth,我认为这是相关的。我到处都找不到答案 我正在建立一个网站和一个使用我自己API的移动应用程序。我的应用程序的每个用户都有一个用户名和密码,这将允许他访问应用程序/网站,并通过API访问他的信息 我不确定处理用户登录流的正确方法: 在这个网站上,我有自己设计的登录表单。我不想将用户移动到我的授权服务器登录,然后让他批准他提供的信息-他是我系统上的用户-我可以访问所有信息-kida像facebook一

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

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

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

  • 在这个网站上,我有自己设计的登录表单。我不想将用户移动到我的授权服务器登录,然后让他批准他提供的信息-他是我系统上的用户-我可以访问所有信息-kida像facebook一样可以登录和访问信息-他们不会问你愿意给他们什么。那么隐式真的是这样吗
  • 在移动应用程序上,我也有一个登录表单,现在我在这里读到()OAuth方法是在WebView中登录??看起来facebook登录并不是在他们的移动应用程序的网络视图中
  • 我首先看到的方法是资源所有者。用户将登录,获得令牌和刷新令牌,并可以开始使用MyAPI。但是在移动应用程序上存储我的客户id和密码?网站上的javascript文件?感觉不对。我当然可以调用一个API来屏蔽它们,并作为登录过程的代理。。。但是(读#4)
  • 将来我希望允许第三方开发者访问。为了让他们允许我系统的用户登录,我将使用隐式流。此外,我计划让这些开发人员帐户具有受限的API访问权限(例如,对API的调用数量将受到计划的限制)。是什么阻止了这些开发人员在其网站上的“我的系统”上请求其帐户的用户名和密码,使用访问令牌和刷新令牌从我的服务器获得响应,以及不受限制地使用我的API,以及访问整个用户配置文件
  • 假设我坚持使用资源所有者流,从服务器接收回一个令牌和一个刷新令牌。我应该在移动设备上存储什么以及如何存储?浏览器中应该存储什么以及如何存储?刷新令牌?每次他打开应用程序,都会得到一个新的更新令牌和那个刷新令牌
  • 编辑


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

    你说的没错,你不应该在你的应用程序中存储
    客户端密码,但我怀疑你能否绕过存储
    客户端id
    。您还可以禁用应用程序的同意屏幕,并构建本机登录视图。如果您不希望用户每次使用您的应用程序时都登录,您需要将
    access\u令牌
    refresh\u令牌
    存储在设备上(可能在数据库中加密)

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

  • 在您的(web)应用程序中嵌入
    客户端密码
  • 设置哪些主机可以访问IdentityServer上的api
  • IdentityServer生成一个salt并将其发送到客户端
  • 客户端使用
    散列(ip地址+会话盐)计算会话秘密
  • 客户端使用
    session\u secret
    client\u secret
    进行API调用
  • 服务器验证
    hash
    client\u secret

  • 几乎不可能完全阻止某人使用您的API。但是,您应该添加各种速率限制方法,例如限制IP地址、API调用等。但是,没有任何方法可以阻止有人对您的应用程序进行反编译并访问您的
    客户端id

    只需禁用同意请求,然后或针对特定的idp(本地帐户)@Mardoxx,可通过为客户端设置
    requiresent=false
    来完成