如何使用oauth2静默登录用户?

时间:2019-12-13 01:43:23

标签: php api oauth-2.0

我正在为预订平台构建一个Web应用程序,并且正在使用oauth2来使用其 API 和对用户进行身份验证。我的应用嵌入在另一个我称为不受控制的名为“ X”的网站中。当用户单击我的应用程序时,它将https://localhost/?_account_id=12加载到iframe中,其中_account_id=12是X网站中自己的帐户ID。

  • 我正在使用oauth2 授权代码流,因此用户批准了我的应用。
  • 我正在安全地存储授权服务器提供的刷新令牌。
  • 我在会话中存储account_id参数。
  • 授权服务器不支持著名的prompt=none
  • 这是我第一次使用oauth2,所以也许我不正确地了解oauth2的工作原理。

由于出于安全性考虑,我不仅只能依靠_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

我重复一遍,授权和回调之间没有批准屏幕。

我的问题:如何使用授权码流隐式流对用户进行静默身份验证?换句话说,如何模仿上述行为?

谢谢您的回答!

2 个答案:

答案 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参数。

谢谢您的回答!

相关问题