Oauth 2.0 是";“资源所有者密码凭据”;OAuth2安全吗?

Oauth 2.0 是";“资源所有者密码凭据”;OAuth2安全吗?,oauth-2.0,Oauth 2.0,因此,我正在开发一个API,使用slim/slim和league/oauth2服务器来管理oauth2连接。OAuth2将非常有用,因为我需要在服务之间使用客户端凭据授予 然后,我还开发了一个混合应用程序,使用React Native。此应用程序需要用户使用电子邮件和密码登录,或连接其他服务(如Facebook、Google、Twitter等) 我不知道OAuth2流在这个案例中使用什么。网络上有很多文章说,资源所有者密码凭据不再安全,我们应该使用PKCE的身份验证代码 但我无法发现或理解如何在

因此,我正在开发一个API,使用
slim/slim
league/oauth2服务器来管理oauth2
连接。OAuth2将非常有用,因为我需要在服务之间使用客户端凭据授予

然后,我还开发了一个混合应用程序,使用React Native。此应用程序需要用户使用电子邮件和密码登录,或连接其他服务(如Facebook、Google、Twitter等)

我不知道OAuth2流在这个案例中使用什么。网络上有很多文章说,资源所有者密码凭据不再安全,我们应该使用PKCE的身份验证代码

但我无法发现或理解如何在第一方应用程序中使用PKCE应用身份验证代码,因为所有文档都提到您需要使用浏览器在重定向\u uri中获取身份验证代码

我想象的流动是这样的:

  • 用户打开应用程序,然后插入您的凭据
    用户名
    密码
  • 此屏幕将连接到API
    /request\u token
    URI发送
    {'grant\u type':'password','username':username','password':password,'client\u id':client\u id}
    ,考虑到它是一个公共应用程序,我们无法发送
    client\u secret
  • API验证凭证并返回一些数据,如
    {“access\u token”:access\u token,“token\u type”:“JWT”,“expires\u in”:LIFE\u SPAN}
    ,这里我们将使用JWT基于
    公钥/私钥
    生成
    访问令牌
  • 身份验证完成后,应用程序将在其处于活动状态时存储
    访问\u令牌
    ,当其过期时,将执行流以
    刷新\u令牌
  • 我的问题:安全吗

    应用程序是如何做到这一点的?例如,当我使用Instagram应用程序时,他们拥有应用程序和API,在用户体验流程中我不需要浏览器。现代应用程序是否使用“资源所有者密码凭据”或“PKCE身份验证代码”?在使用“带PKCE的身份验证代码”时,有一种避免在流中插入浏览器的方法

    [编辑]可能的解决方案

    正如Gary Archer所说,“建议使用PKCE进行身份验证代码流,并通过系统浏览器登录”,但我们并不是说授予访问用户数据或第三方应用程序的权限

    作为一名设计师,我不同意同一API所有者拥有的第一方应用程序中的loggin需要一个浏览器,这不是我们想要的用户体验。我们看到的所有应用程序,如Instagram、Facebook、Uber。。。我们只需输入您的用户名和密码,就可以访问您的帐户

    我要做的是创建一个自定义版本的身份验证代码,PKCE删除必需的\u uri

    [编辑:2]新流程

    经过大量的搜索,我找到了一些我认为很有趣的答案。如上所述,我从流中删除了
    redirect\u url
    。看:

  • 当用户提供您的凭证时,该流程在登录屏幕中启动
  • 客户端生成一个
    code\u验证器
    ,然后将
    code\u验证器
    散列到
    code\u质询
    ,并使用以下参数将其发送到授权服务器:

    • response\u type=code
      :表示您的服务器希望收到授权代码
    • client\u id=xxxx
      :客户端id
    • client\u integrity=xxxx
      :第一方应用程序的应用程序完整性检查
    • code\u challenge=xxxx
      :如前所述生成的代码质询
    • code\u challenge\u method=S256
      :普通或S256,取决于质询是普通验证器字符串还是字符串的SHA256哈希。如果省略此参数,服务器将假定为普通
    • username=xxxx
      :要验证的用户名
    • password=xxxx
      :密码的哈希版本
    • state=xxxx
      :应用程序生成的随机字符串(CSRF保护)
  • 授权服务器将验证用户身份验证,存储
    code\u挑战
    ,并使用
    client\u令牌返回
    Authorization\u代码

  • 在收到
    a授权\u代码
    client\u令牌
    后,客户端保存
    client\u令牌
    ,并立即使用以下参数将
    authorization\u代码
    发送回授权服务器:

    • grant\u type=authorization\u code
      :指示此令牌请求的授予类型
    • code=xxxx
      :客户端将发送其获得的授权代码
    • client\u id=xxxx
      :客户端id
    • code\u verifier=xxxx
      :客户端最初在授权请求之前生成的PKCE请求的代码验证器
  • 授权服务器将验证所有数据,如果一切正常,将返回
    access_令牌

  • 客户端将使用
    access\u token
    设置授权头,并始终向每个请求发送
    Client\u token
    ,只有在两个值都正确时才会被接受
  • 如果
    access\u-token
    过期,客户端将请求刷新
    access\u-token
    并获取一个新的
  • 现在,我将把这个逻辑复制到PHP语言中。如果一切顺利,我希望一切顺利,我会带着明确的答案回来

    [编辑]澄清

    我正在使用OAuth2与您的第三方帐户(谷歌、Facebook等)进行用户连接。但用户也可以登录到我数据库中的本地帐户。对于这种情况,用户根本不需要授予任何权限。所以