Я использую Angular 6 для внешнего интерфейса и PHP для внутреннего интерфейса (WAMP), и я хочу сделать систему входа в систему. Когда кто-то вводит действительные учетные данные, я хочу, чтобы его перенаправили на HTTP: // локальный: 4200 / дом
я имею auth.php который устанавливает переменные сеанса, когда кто-то вводит правильное имя пользователя / пароль и verify.php проверить, установлены ли переменные сеанса.
Хотя приложение перенаправляет меня на дом, verify.php не может видеть переменные сеанса.
Это мои файлы:
регистрационное_имя 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
}
?>
мой 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');
}
Есть ли способ исправить эту проблему с помощью сессии или мне нужно использовать другой метод проверки в угловых?
Спасибо.
Вы не можете установить 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.
Других решений пока нет …