我正在为预订平台构建一个Web应用程序,并且正在使用oauth2来使用其 API 和对用户进行身份验证。我的应用嵌入在另一个我称为不受控制的名为“ X”的网站中。当用户单击我的应用程序时,它将https://localhost/?_account_id=12
加载到iframe中,其中_account_id=12
是X网站中自己的帐户ID。
account_id
参数。prompt=none
。由于出于安全性考虑,我不仅只能依靠_account_id
参数,因此每次用户连接到我的应用程序时,我都需要对其进行身份验证。这样做,每次会话到期时,应用程序都会提示用户批准我的应用程序。
对于X中可用的其他应用程序,从不提示我重新批准这些应用程序。因此,在分析它们时,每次连接到其他应用程序时,浏览器的网络开发人员工具都会列出此内容:
204
https://other_app_provider/fr/admin?_account_id=12
302
https://other_app_provider/auth/?_account_id=12
302
https://authorization_server/oauth/authorize?_account_id=12&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&scope={SCOPES}&state={STATE}
302
https://other_app_provider/auth/bookingsync/callback?code={CODE}&state={STATE}
200
https://other_app_provider/admin
我重复一遍,授权和回调之间没有批准屏幕。
我的问题:如何使用授权码流或隐式流对用户进行静默身份验证?换句话说,如何模仿上述行为?
谢谢您的回答!
答案 0 :(得分:0)
我可以先问几个问题-看看我是否了解这种情况:
用户是否先登录到主机应用X,然后将您的应用作为插件加载?
这是不同公司构建主机和插件的联合方案吗?
主机和插件使用同一授权服务器,还是使用不同用户凭证的不同登录系统?
避免同意提示可能很简单,只需在授权服务器中为您的应用关闭OAuth客户端条目中的此设置
值得注意的是,由于clickjacking concerns,iframe中的OAuth登录经常被阻止,更可靠的选择是使用弹出式窗口进行插件登录。
在某些情况下,要使解决方案看起来像一个集成的UI,可能很难或无法实现预期的行为-但您的要求变得非常普遍。
答案 1 :(得分:0)
我找到了解决方法:
X授权服务器中有一个选项account_id
记录不充分:
预先选择要授权的帐户
在调用您的管理URL时,我们传递参数
_account_id
。在授权过程中,此参数的值可用作account_id
参数。这样会在使用“授权代码流”或“隐式流”时预先选择要授权的帐户。
因此,我可以通过在授权url中传递account_id
参数来模仿问题中描述的行为。
现在,我了解预选这个词的来源是:
检查帐户所有者是否已连接到主机应用程序,选择其帐户,并在该应用程序中静默验证该帐户所有者(如果该帐户已被批准)。
如果我在网络开发人员工具中没有看到它,那是因为它们是X提供的,所以X可能会使用cookie /会话来 Pre-Select 授权帐户。我必须安装第三方应用程序才能在授权URL中看到account_id
参数。
谢谢您的回答!