当前位置: 首页 > 知识库问答 >
问题:

如何检查用户是否仍然使用 PHP OAUTH 登录

方季同
2023-03-14

我正在构建一个对Azure AD进行OAUTH身份验证的Web应用程序。我的意思是,您通过您的Azure AD/Office e365帐户登录我的应用程序。登录成功后,我将Azure AD用户的GUID与我的Mysql数据库中的用户匹配。我在用户登录的会话信息中设置。

我使用这个howto作为它的基础:https://kv AES . WordPress . com/2016/10/21/azure-using-PHP-to-go-all-oauth 2-on-the-management-API/

我用来让一个用户登录我的PHP应用程序的代码的基础是:

//User is not logged in, try to log in
$provider = new TheNetworg\OAuth2\Client\Provider\Azure([
 'clientId' => getsetting('aadsso_clientid'),
 'clientSecret' => getsetting('aadsso_secret'),
 'redirectUri' => getsetting('aadsso_redirecturl')
]);

if (!isset($_GET['code'])) {

    // If we don't have an authorization code then get one
    $authUrl = $provider->getAuthorizationUrl();
    $_SESSION['oauth2state'] = $provider->getState();
    header('Location: '.$authUrl);
    exit;

// Check given state against previously stored one to mitigate CSRF attack
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {

    unset($_SESSION['oauth2state']);
    exit('Invalid state');

} else {

    try {
      // Try to get an access token (using the authorization code grant)
      $token = $provider->getAccessToken('authorization_code', [
          'code' => $_GET['code'],
          'resource' => 'https://graph.windows.net',
      ]);
    } catch (Exception $e) {

        exit ("Connection error. Contact the administrator");
    }

    // Optional: Now you have a token you can look up a users profile data
    try {

        // We got an access token, let's now get the user's details (AAD login succeeded)
        $me = $provider->get("me", $token);

        //Some code here LEFT OUT, to find the user in my MySQL database.

        $_SESSION['loggedin'] = 1;
        $_SESSION['aadguid']  = $me['objectId'];



    } catch (Exception $e) {


        // Failed to get user details
        exit ("Connection error. Contact the administrator");
    }

}

这工作正常!但是,当我设置“$_SESSION['loggedin'] = 1;”时,用户登录到应用程序。

我真的很想了解如何让用户在退出Azure AD/Office e365会话时退出我的应用程序。例如,他登录到我的应用程序,转到outlook.office.com,然后单击那里的注销。当他返回到我的应用程序并尝试加载页面时,我的应用程序应该“看到”他已退出Azure AD。

如何在不损失应用程序性能的情况下实现此目的?

我在这方面还是个新手,但是请给我一些建议。

共有1个答案

苏鸿才
2023-03-14

这可能与您正在使用的代码不同,但Microsoft有一个关于PHP如何身份验证的示例:https://learn.microsoft.com/en-ca/graph/tutorials/php?tutorial-step=3 您将看到在该示例中的某个地方,他们为Laravel实现了注销URL路由。

然后在您的应用程序注册下进行身份验证-

我知道在将其添加到代码中方面,这并不完全是您所要求的,但请查看示例,您可能需要进行测试。

 类似资料:
  • 问题很简单。我想限制来自不同机器/浏览器的相同登录的用户访问:只有一个实时用户会话是可能的。 库用于用户认证和管理。 当然,这可以使用简单的同步化地图等来完成。但问题是:是否为此制定了特殊机制? 这个问题的另一个变体:如何检索使用< code>apache shiro登录系统的所有主题的列表? UPD: 澄清我的问题。我的愿望是有一些这样的代码(我知道,没有这样的类异常,但这个想法必须更干净):

  • 问题内容: 我正在看这个网站,但似乎无法弄清楚该怎么做,因为它不起作用。我需要检查当前站点用户是否已登录(已验证),并且正在尝试: 尽管确定用户已登录,但它仅返回: 我可以执行其他请求(来自上面url的第一部分),例如: 这将返回成功的响应。 问题答案: Django 1.10+更新:现在是Django 1.10中的属性。为了向后兼容,该方法仍然存在,但在Django 2.0中将被删除。 对于Dj

  • 因此,我正在使用Selenium和Python进行一些web抓取,我遇到了一个问题。我正在单击下一个按钮以移动到某个网站上的下一页,但我需要在到达最后一页时停止单击。现在,我的想法是使用some_element。在try/except语句中单击()并等待,直到该按钮不再可单击时出现错误。似乎,.click()不发出任何类型的信号,当按钮不能被点击时,它不会抛出错误,也不会发出任何真或假信号。 我尝

  • 问题内容: 我想检查浏览器是否仍然存在,如果不存在,那么我想打开一个新的浏览器!网络驱动程序中是否有可用的api来检查浏览器是否仍然存在? 问题答案: 调用后,将driver的值设置为 但是,如果调用,它将驱动程序的值设置为 因此,如果您在调用 driver.quit() 之后检查浏览器窗口,则可以通过以下实现知道。

  • 如何检查用户是否在公共页面上的Keycloak中进行了身份验证,而不需要用户导航到某个受保护的页面或之前的登录页面?

  • 我在这里读到了如何在一个基于Symfony2的网站的小树枝模板中检查用户的登录状态。但是,我需要知道如何检查用户是否从控制器内部登录。我确信以下代码是正确的: 但它总是返回一些信息,例如,登录用户或匿名用户。 有什么想法吗?提前谢谢。