PHP-сессия не работает в проекте Angular 6 - PullRequest
0 голосов
/ 24 октября 2018

Я использую angular 6 для внешнего интерфейса и PHP для внутреннего (WAMP) и хочу создать систему входа в систему.Когда кто-то вводит действительные учетные данные, я хочу, чтобы его перенаправили на http://localhost:4200/home

У меня есть auth.php , который устанавливает переменные сеанса, когда кто-то вводит действительное имя пользователя / парольи verify.php , чтобы проверить, установлены ли переменные сеанса.Хотя приложение перенаправляет меня на дом, verify.php не может видеть переменные сеанса.

Это мои файлы:

login-form.component.ts

loginUser(event) {
const target = event.target;
const username = target.querySelector('#username').value;
const password = target.querySelector('#password').value;

this.Auth.login(username, password).subscribe(data => {
  if(data.success) {
    this.router.navigate(['/home']);
  }
  else {
    window.alert(data.message);
  }
});
}

, который берет имя пользователя и пароль из html и отправляет их в службу

auth.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'

interface myData {
  success: boolean,
  message: string
}

@Injectable({
  providedIn: 'root'
})
export class AuthService {

  constructor(private http: HttpClient) { }

  login(username, password) {
     return this.http.post<myData>('http://localhost/angular6-app/api/auth.php', {username, password}, 
    {
      headers : {
          'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
      } 
    })

  }

auth.php

include 'config.php'; 
header('Access-Control-Allow-Origin: http://localhost:4200'); 

$postdata = file_get_contents("php://input");
if(isset($postdata) && !empty($postdata)) {

    $request = json_decode($postdata);
    $username = $request->username;
    $password = $request->password;
    $sql = "select * from user where username = '$username'";
    $result = $conn->query($sql);              
    $row = $result->fetch_assoc();

    if($row['username'] == $username && password_verify($password, $row['password'])) //kanei verify me to hash pou exei ginei
        {
            $_SESSION['username'] = $username;  
            $_SESSION['loggedin'] = true;
            ?>
            {
                "success": true,
                "message": "You have logged in"
            }
            <?php
        }
    else {
        ?>
        {
            "success": false,
            "message": "Invalid credentials"
        }
        <?php
        }
}

?>

и, наконец, verify.php

<?php
session_start();
header('Access-Control-Allow-Origin: http://localhost:4200');

if (isset($_SESSION['loggedin'])) {
    ?>
    {
        "success": true,
        "message": "You have the right."

    } 
    <?php
}
else {
    ?>
    {
        "success": false,
        "message": "You DONT have the right."
    }
    <?php
}

?>

My home.component.ts имеет этот класси я хочу отобразить в HTML «У вас есть право», но он отображает «У вас нет права», потому что переменная loggedin не определена.

export class HomeComponent implements OnInit {

  message = "Loading..."

  constructor(private user: UserService) { }

  ngOnInit() {
    this.user.getSomeData().subscribe(data => {
      this.message = data.message;
    })
  }

getSomeData () реализованв user.service.ts

getSomeData() {
    return this.http.get<myData>('http://localhost/angular6-app/api/verify.php');
  }

Есть ли способ исправить эту проблему с помощью сеанса или мне нужно использовать другой метод проверки в angular?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Вы получите значения сеанса после того, как соберете ngApp, запустите его и сохраните свое приложение и API в одном каталоге, вы можете использовать тот же метод, что и выше.Потому что вы собираетесь получить доступ к API с тем же портом / доменом.

0 голосов
/ 24 октября 2018

Вы не можете установить SESSION в одном домене и использовать в другом домене. Из вашего кода ясно, что вы используете два разных порта, если вы хотите использовать сеансы, javascript и PHP должны быть в одном домене / портах.

Если вы хотите использовать другие домены / порты, вам нужно найти другие способы, такие как аутентификация на основе токенов, т.е. в auth.php после успешного входа в систему создайте токен, который будет сохранен в вашей базе данных, отправьте этот токен обратно в свойуспешный ответ.

в вашем угловом хранилище сохраните этот токен в хранилище (или там, где вы предпочитаете) и извлеките данные об использовании из вашего PHP API, используя этот токен.

поэтому, когда вы делаете вызов в user.service.ts , ваш URL должен содержать токен

YOUR_TOKEN = '1234'//received after successfull login and saved in local storage
return this.http.get<myData>('http://localhost/angular6-app/api/verify.php?token='+YOUR_TOKEN);

в вашем verify.php

$token = $_GET['token'];
// check if token is valid in your database and send response

пс при выходе из системы, убедитесь, что истек или удалили токен из хранилища и базы данных angulare.

...