如果您拥有设备上的应用程序(例如桌面程序,移动设备应用程序),则可以使用OpenID Connect,但需要注意以下几点:
使用资源所有者凭证(grant_type: password
)是最简单的方法,但是如果身份验证服务器操作员由于信任原因(例如,他们不希望您)而不允许您使用该授予类型,则可能无法使用自己收集用户的用户名和密码)-或者他们具有动态或自定义的身份验证用户界面,而该用户界面很难在本机应用程序中复制。
通过交互流程(隐式,混合),身份验证服务器的身份验证页面显示在应用程序内Web视图中。大多数用户都不知道应用程序可以在身份验证页面上监听并捕获其用户名和密码,尤其是在移动设备上-但是通过这种方式,应用程序代码可以轻松捕获授权代码和/或访问令牌,并自动关闭网络-view,无需任何其他用户交互。 (令我惊讶的是,我还没有听说过更多情况下这种恶意应用会捕获用户详细信息的情况。)
...因此建议始终使用系统的Web浏览器打开身份验证页面,但是在Windows桌面上,系统Web浏览器没有返回服务器对应用程序代码响应的良好标准方法,尽管目前有许多方法在使用:
access_token
响应)复制并粘贴回桌面应用程序。access_token
。authHelper.exe
,该实用程序在被调用时会将其命令行参数转发到用户会话中的命名管道。authHelper.exe
密钥中将HKCU\Software\Classes
注册为临时URI方案处理程序,例如my-application:
,以便将任何my-application:
URI的内容作为参数传递给authHelper.exe
。redirect_uri
参数设置为my-application:
,因此在用户在浏览器中进行身份验证之后,浏览器将请求自定义URI方案由Windows处理,Windows调用authHelper.exe "access_token=..."
,然后将数据沿命名管道发送到正在运行的应用程序。HKCU\Software\Classes
键,或者使用的Windows版本不支持带有EXE注册的自定义URI方案处理程序,则此操作不工作。我想知道是否可以使用其他方法:为什么应用程序不能简单地向身份验证服务器轮询身份验证尝试的状态?还是这种方法已经存在,如果存在,流程或授权的名称是什么?
这是我建议的流程:
status: pending
,但是最终在用户在超时窗口内成功进行身份验证之后,应用程序的轮询请求将表明尝试成功,并且还包含{{ 1}}或授权代码(如适用)。如果用户验证失败(例如3次不正确的尝试)或将窗口打开足够长时间而导致超时,则轮询响应将指示失败。这个已经存在并且有名字吗?这种方法是否存在潜在的安全风险或漏洞?
答案 0 :(得分:3)
该名称存在,并且名为“无浏览器和输入受限设备的OAuth 2.0设备流程”,但尚未完全标准化,请参阅:https://tools.ietf.org/html/draft-ietf-oauth-device-flow
Google还以特定于供应商的方式实施了前卫流程: https://developers.google.com/identity/protocols/OAuth2ForDevices