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

使用php后端时无法保持角度登录

景鸿晖
2023-03-14

我试图使一个登录系统与PhP后端角。

当人们登录时,这是一个名为:

// here check for good request
$account = // found the account thanks to PDO
$accountId = $account["id"];
session_start();
$_SESSION["accountId"] = $accountId;
setcookie("accountId", $accountId, [
    'expires' => time() + 86400,
    'path' => '/',
    'domain' => $_SERVER['HTTP_HOST'],
    'secure' => true,
    'httponly' => false,
    'samesite' => 'None',
]);

然后,当我想根据用户获取信息时,我调用这个脚本:

session_start();

if(!isset($_SESSION["accountId"]) && !isset($_COOKIE["accountId"])) {
    echo "You are not logged";
    die();
}
$accountId = isset($_SESSION["accountId"]) ? $_SESSION["accountId"] : $_COOKIE["accountId"];

// here get data
echo json_encode($accountId);

当我在我的浏览器中这样做的时候,它工作了。

但是当我使用 angular 时,_SESSION 美元_COOKIE 美元是空的,所以它向我显示“您没有被记录”。

我的代码在角度:

this.http.get<T>("http://my-url.com/script.php").toPromise().then((result) => console.log(result));

我的问题:

我应该如何使用PhP/Angular请求根据登录的帐户进行安全登录和数据请求?我是否应该更改html" target="_blank">语言(改为Java/C#/…)*(这对我来说不是问题)?

我试了什么?

  • 在角获取方法上使用{和凭据:真}
this.http.get<T>("http://my-url.com/script.php", { withCredentials: true }).toPromise().then((result) => console.log(result));

我得到了一个CORS错误。在更新我的标题后(见下文),我得到了同样的结果:在浏览器中它很好,但不是有角度的。

>

  • 我尝试使用$_SESSION$_COOKIE。两者都在我的浏览器中工作,但不在angular中。

    我想每次都将accountId放在请求中。但这显然不安全,也不是一个很好的主意。。。

    比如我有CORS问题,我添加几行来管理它们:

    header('Access-Control-Allow-Headers: Access-Control-Allow-Origin, Content-Type');
    header('Access-Control-Allow-Origin: http://localhost:4200');
    header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
    header('Access-Control-Allow-Credentials: true');
    header('Content-Type: application/json, charset=utf-8');
    

    但是,它解决了所有CORS问题,但不是我的会话/cookie为空。

    那么,我怎样才能像我的浏览器一样在 Angular 中保留会话和/或 cookie?

  • 共有3个答案

    晏望
    2023-03-14

    必须在php脚本中添加cors头

    header('Access-Control-Allow-Origin: *');
    
    header('Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS');
    
    header("Access-Control-Allow-Headers: *");
    
    叶坚
    2023-03-14

    我认为你的问题不在于CORS。我在php后端(具体来说是CodeIgniter)遇到过类似的情况,问题出在SameSite cookie属性上。尝试将此代码添加到配置文件或索引中:

    setcookie($name, $value, [
        'expires' => time() + 7200,
        'path' => '/',
        'domain' => 'domain.com',
        'secure' => true,
        'httponly' => false,
        'samesite' => 'None',
    ]);
    

    或者对于php

     session_set_cookie_params([
        'lifetime' => time() + 7200,
        'path' => '/',
        'domain' => $_SERVER['HTTP_HOST'],
        'secure' => true,
        'httponly' => false,
        'samesite' => 'None'
    ]);
    

    检查这个问题,它可能会给你更多的提示。

    慕容典
    2023-03-14

    首先,您可以尝试使用香草js函数fetch(“url”)来处理cookie和会话存储。

    但我建议您对 API 请求使用令牌,而不是会话存储或 cookie。您的问题会更少,以后升级也更容易。

    例如

    当然,你需要重新设计你的数据库和你的PHP代码(作为JS代码)。当用户登录时,为了增加一点安全性,您可能需要根据需要使用 md5() 或更好的方法(如 AES)对密码进行哈希处理,并检查此哈希值是否在数据库中对应。然后,响应成功或错误,后跟用户的令牌(在注册 PHP 期间创建,通常是几个 md5() 和 uniqid())。此令牌必须很长以避免暴力破解。

    然后,一旦用户登录并且Js代码拥有令牌,您只需使用此令牌发出API请求。更常见的是,令牌在标头中提供,授权:承载

     类似资料:
    • 问题内容: 运行Angular Protractor测试后是否可以将测试浏览器窗口保持打开状态?我在FireFox中失败了一个艰难的测试,访问网页状态以查看发生了什么非常有用。 问题答案: 您可以使用量角器调试/暂停功能来暂停e2e运行,这最终将使浏览器保持打开状态:此处有更多信息 为此,请在失败的量角器测试上添加此行 还有一个非常有用的工具,称为elementor,您稍后可能需要看看。

    • 我正在创建一个Ionic应用程序(iOS和带有电容的Android)。我在我的应用程序中添加了Firebase身份验证,但每次退出应用程序时,我都需要重新登录。 我看到了这个,但是没有太多的文档,并且我尝试了它但是没有工作。我不确定我正确地使用了它,或者在正确的地方添加了代码。https://firebase.google.com/docs/auth/web/manage-users?HL=en

    • 问题内容: 我正在尝试使用Selenium Web驱动程序和node js自动执行几个页面。我可以登录,但是登录后我想使用由Web驱动程序启动的同一会话,以便可以在受会话保护的页面上进行自动测试。这是我的尝试 登录后我不小心丢弃了浏览器吗? 问题答案: 您可能只在处理计时问题。硒移动 非常快 。比您作为用户进行交互的方式要快得多。因此,它通常以似乎无法预测的方式起作用。但这仅仅是因为Seleniu

    • 我们没有通过magento连接安装m2epro,因此我们无法升级M2epro。M2epro支持团队建议删除以下文件并使用Magento连接安装。 应用程序/代码/社区/Ess/M2ePro、应用程序/设计/adminhtml/默认/默认/布局/M2ePro.xml、应用程序/设计/adminhtml/默认/默认/模板/M2ePro、应用程序/等/模块/Ess_M2ePro.xml、js/M2ePr

    • 问题内容: 我正在使用magento社区版本1.7.0.2。我无法登录到magento的后端。我知道此问题可能是由于Chrome不接受Cookie所致。但是如何解决该问题,请提供帮助。谢谢 问题答案: 一种简单的解决方案是使用Opera浏览器进行安装并使用它登录,因为它会保存cookie本身。有用!

    • ![Frame Details][firebug正确显示了帧,但无法切换到帧]1 我正在尝试切换到id =所有设备的框架,但无法到达那里。我可以切换到任何其他框架,但不能切换到这个框架。以下是我尝试过的选项 browser.driver.switchTo(). frame('所有设备');browser.driver.switchTo(). frame(browser.driver.findEle