Oauth 当redirect#u uri不'时,应用程序是否有OpenID Connect授权类型或机制来轮询验证代码;你不申请吗?

Oauth 当redirect#u uri不'时,应用程序是否有OpenID Connect授权类型或机制来轮询验证代码;你不申请吗?,oauth,oauth-2.0,openid-connect,Oauth,Oauth 2.0,Openid Connect,如果您有一个设备上的应用程序(例如桌面程序、移动设备应用程序),您可以使用OpenID Connect并附带一些注意事项: 使用资源所有者凭据(grant\u type:password)是最简单的,但如果身份验证服务器运营商由于信任原因(即,他们不希望您自己收集用户的用户名+密码)而不允许您使用该授予类型,则可能无法使用该凭据-或者如果他们有一个在本地应用程序中很难复制的动态或自定义身份验证UI 通过交互流(隐式、混合),身份验证服务器的身份验证页面显示在应用程序内的web视图中。大多数用户都

如果您有一个设备上的应用程序(例如桌面程序、移动设备应用程序),您可以使用OpenID Connect并附带一些注意事项:

使用资源所有者凭据(
grant\u type:password
)是最简单的,但如果身份验证服务器运营商由于信任原因(即,他们不希望您自己收集用户的用户名+密码)而不允许您使用该授予类型,则可能无法使用该凭据-或者如果他们有一个在本地应用程序中很难复制的动态或自定义身份验证UI

通过交互流(隐式、混合),身份验证服务器的身份验证页面显示在应用程序内的web视图中。大多数用户都不知道应用程序可以窥探身份验证页面并捕获他们的用户名和密码,尤其是在移动设备上——但通过这种方式,应用程序代码可以轻松捕获授权代码和/或访问令牌,并自动关闭web视图,而无需任何额外的用户交互。(我很惊讶,我还没有听说有更多的用户详细信息被恶意应用程序以这种方式捕获的案例。)

…因此,建议始终使用系统的web浏览器打开身份验证页,但在Windows桌面上,系统web浏览器没有良好的标准方式将服务器响应返回到应用程序代码,尽管目前使用的方法有很多:

  • “身份验证成功”页面指示用户将一组文本(包含授权代码或
    access\u令牌
    response)复制并粘贴回桌面应用程序
  • 按照上面的说明,在应用程序托管的web视图中显示页面
  • 如果身份验证过程始终只需要用户名和密码(例如),应用程序仍然可以使用自己的UI捕获用户的用户名和密码,然后发出自己的HTTP请求,使其看起来像用户的web浏览器会话,并通过这种方式获取授权码和/或
    访问令牌
  • 仅在Windows上:
    • 有一个小的实用程序
      authHelper.exe
      ,当调用该程序时,它会将其命令行参数转发到用户会话中的命名管道
    • 主客户端应用程序将在每用户
      HKCU\Software\Classes
      键中注册
      authHelper.exe
      作为临时URI方案处理程序,例如
      my application:
      ,以便将任何
      my application:
      URI的内容作为参数传递到
      authHelper.exe
    • 传递给系统web浏览器以打开身份验证页的URI将
      重定向\u URI
      参数设置为
      我的应用程序:
      ,因此用户在浏览器中进行身份验证后,浏览器将请求由Windows处理的自定义URI方案,该方案调用
      authHelper.exe“access\u token=…”
      ,然后通过命名管道将数据发送到正在运行的应用程序
    • 如果用户没有权限写入自己的
      HKCU\Software\Classes
      密钥,或者如果用户使用的Windows版本不支持带有EXE注册的自定义URI方案处理程序,则此操作不起作用
  • Windows UWP应用程序也可以使用Web身份验证代理
我想知道是否可以使用另一种方法:为什么应用程序不能简单地轮询身份验证服务器以获取身份验证尝试的状态?或者这种方法是否已经存在,如果已经存在,那么流程或授权的名称是什么

以下是我提议的流程:

  • 当用户想要进行身份验证时,应用程序会像以前一样打开系统web浏览器,但会使用应用程序提供的一次性使用不透明ID的另一个参数
  • 一旦系统浏览器打开,应用程序就会每隔500毫秒左右(即轮询循环)使用其自己的HTTP客户端向身份验证服务器发出请求,该客户端会询问与之前相同的不透明ID关联的活动身份验证尝试的状态
  • 从身份验证服务器到应用程序的最初几个响应可能是
    状态:pending
    ,但最终,在用户在超时窗口内成功进行身份验证后,应用程序的轮询请求将指示一次成功的尝试,并且还包含
    access\u令牌
    或适用的授权代码。如果用户未能进行身份验证(例如,3次不正确的尝试)或让窗口打开足够长的时间导致超时,则轮询响应将指示失败
  • 这个已经存在了吗?它有名字吗?这种方法是否存在任何潜在的安全风险或漏洞?

    它存在,并有一个名称,“用于无浏览器和输入受限设备的OAuth 2.0设备流”,但尚未完全标准化,请参阅:

    谷歌还以特定于供应商的方式实施了avant la lettre流程: