Angular 5 в PHP POST возвращает всегда 403 - PullRequest
0 голосов
/ 06 июня 2018

У меня была рабочая версия, но после некоторых изменений (я понятия не имею, что) она больше не работает.Теперь я вернул все в очень простое приложение, чтобы убедиться, что на его пути больше ничего нет.Да, я знаю, что это плохой тренировочный код, но это не имеет значения, я просто хочу знать, что с этим не так.

Теперь мой код, это не все, но я думаю, что это все, что вам нужно, чтобы получитьидея, что делает мой код.

Угловой:

Форма:

<form>
  <table cellspacing="0">
    <tr>
      <td>
          <input placeholder="Username" class="form-control" [(ngModel)]="username" name="username" required>
      </td>
    </tr>
    <tr>
      <td>
        <input placeholder="Password" class="form-control" [(ngModel)]="password" type="password" name="password" required>
      </td>
    </tr></table>
</form>
<button mat-raised-button (click)="loginUser()" class="btn btn-primary" color="primary">Login</button>

Компонент:

loginUser() : void {
    let result = this.LoginService.loginUser(this.username, this.password);
    if (result === false) {
      this.wrongLoginNotification = 'Je hebt de onjuiste inloggegevens gebruikt!';
    }
  }

Сервис:

  private loginUrl = 'http://www.url.nl/path/api/?login=true';


  loginUser(username: string, password: string): boolean {
    let auth = {username: username, password: password};
    let authJson = JSON.stringify(auth);

    this.http.post(this.loginUrl, authJson)
      .subscribe(
        data => {
          this.router.navigate(["home"]);
          return true;
        },
        err => {
          return false;
        }
      );

    return false;
  }

Это сообщение на сервер:

{password: "TEST", username: "TEST1"}

Сценарий PHP очень прост и не более чем:

error_reporting(E_ALL);
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

$servername = ""; // Changed this of course ;-)
$username = ""; // Changed this of course ;-)
$password = ""; // Changed this of course ;-)
$dbName = ""; // Changed this of course ;-)
$conn = null;

try
{
  $conn = new PDO("mysql:host=$servername;dbname=$dbName", $username, $password);
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
  echo "Connection failed: " . $e->getMessage();
  header("HTTP/1.1 404");
}

if (isset($_GET['login'])) {
  echo 'Test';
}

Теперь PHP API (в том же домене / URL) возвращает:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /myurl/api/
on this server.<br />
</p>
<p>Additionally, a 403 Forbidden
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>

Что я пробовал?

  • Я сделалпроверьте права доступа к папкам: 755, файлам: 644.
  • GET все еще работает, POST нет.
  • Прочтите несколько сообщений в StackOverflow.Пробовал несколько вещей с файлом .htaccess, например добавление:

    Добавление заголовка Access-Control-Allow-Origin: * Добавление заголовка Методы Access-Control-Allow: "GET, POST, OPTIONS, DELETE, PUT"

Я также общаюсь с моим хостингом.У кого-нибудь есть предложения? Я вижу много вопросов на эту тему, и у каждого есть другое решение .Каков наилучший способ отфильтровать это и добраться до нужной точки?Сейчас я просто пытаюсь что-то сделать, не следуя списку или чему-то, что может привести меня к решению.

Любая помощь будет приветствоваться!

1 Ответ

0 голосов
/ 06 июня 2018

Заголовок должен быть вызван перед любым другим выводом.Таким образом, ваш блок try / catch выглядит примерно так:

try
{
  $conn = new PDO("mysql:host=$servername;dbname=$dbName", $username, $password);
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
  header("HTTP/1.1 404");
  echo "Connection failed: " . $e->getMessage();
}

EDIT: также попробуйте удалить authJSON и использовать вместо него auth.Просто передайте этот объект JSON напрямую.

...