Это устаревшее приложение, которое все еще использует мое рабочее место, которое недавно случайно перестало работать.Он берет данные из базы данных и отображает их для всех.Первоначально я думал, что это ключ API карт Google, используемый на веб-сайте, который перестал работать, но после исправления этой ошибки я получаю сообщение об ошибке, как только я пытаюсь войти на сайт.
Я не сделалнаписать этот код, и он работал в течение многих лет, прежде чем он случайно перестал работать.Кроме того, обновление angular буквально ломает все, я не могу этого сделать.
Прежде всего, это ошибка, которую я получаю, как только я пытаюсь войти в систему
userAuthentication failed: Http failure during parsing for mywebsite/assets/Php/users.php
core.js:1673 ERROR TypeError: Cannot read property 'split' of undefined
at JwtHelperService.push../node_modules/@auth0/angular-jwt/src/jwthelper.service.js.JwtHelperService.decodeToken (jwthelper.service.js:70)
at SafeSubscriber._complete (app.component.ts:87)
at SafeSubscriber.wrappedComplete (Subscriber.js:179)
at
Так что кажется, что когдаAngular пытается декодировать токен JWT, он получает нулевое значение, которое не обрабатывается должным образом.Ну, нулевое значение не обрабатывается должным образом, это не проблема, проблема в том, почему есть нулевое значение.
Соответствующий скрипт php такой:
<?php
// Start the session
ini_set('session.cookie_lifetime', 9*3060);
session_start();
?>
<?php require_once("./db_connection.php"); ?>
<?php
header("Access-Control-Allow-Origin: mywebsite");
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header('Access-Control-Allow-Credential: true');
$username = $_POST['uname'];
$password = $_POST['psw'];
$sql = "SELECT * FROM Dashboard_Users WHERE Username='$username' ";
$result = $conn->query($sql);
if($result->num_rows>0){
$all_rows=array();
while($row = $result->fetch_assoc()){
if (strtolower($username)==strtolower($row['Username']) && password_verify($password,$row['Password'])) {
$row['Password']='';
$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
// Create token payload as a JSON string
$payload = json_encode([$row,'exp'=>time()+3600*9]);
// Encode Header to Base64Url String
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
// Encode Payload to Base64Url String
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
// Create Signature Hash
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'abC123!', true);
// Encode Signature to Base64Url String
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
// Create JWT
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
$row['jwttoken']=$jwt;
$row['Password']='';
$_SESSION['JWTtoken']=$jwt;
echo json_encode($row);
}
}
}
//
$conn->close();
?>
Я никогда не слышалJWTtokens до сегодняшнего дня, так что извините за мое невежество.Вот где токены используются в файле angular app-component.ts
requestAuth(){
let form = new FormData();
form.append('uname',this.username);
form.append('psw',this.password);
// Calls users.php to check if user is authorized or not and recieves all the priveledges given to it
this.service.userAuthentication(form,'users.php').subscribe(users=>this.users=users,(err)=>console.log(err),()=>{
// if authentication is successful
if(this.users){
// shows loading and hide authentication display
this.locating=true;
$('#id01').css({"display":"none"});
$('body').css({"background":"url('') #222"});
// recieves jwt token and decode it to get privledges of user
this.global.token= this.users.jwttoken;
// error here
this.global.user = this.jwtHelper.decodeToken(this.global.token);
// error line above
if(this.global.user["0"].Username=='Admin'){
this.global.admin= true;
}
// setting privledges in local storage for latter use of them without authentication
this.storage.set("user",this.global.user["0"]);
// Calling myMap function from map.js
myMap();
setTimeout(()=>{
if(this.global.user["0"][this.cookieService.get('cluster')]==0){
$('#message_failure').html('<div class="alert alert-danger" style="justify-content: center; text-align: center;margin-bottom:0px"><span style="justify-content: center">Access Denied!</span></div>');
}
else{
$('#message_failure').html('');
setTimeout(() => {
this.timeout = false;
}, 3000);
}
},1000);
}
// if authentication fails message throught cookie
else{
this.cookieService.put('message','Authentication Failure');
}
});
}
, это вызывает что-то в другом файле TS, где на самом деле сообщается об ошибке
userAuthentication(form,filename):Observable<Users[]>{
return this.http.post<Users[]>(this.url+filename,form,{withCredentials:true}).pipe(
catchError(this.handleError('userAuthentication',[]))
);
}
// Handles Error of service , if there is some problem it log it down
private handleError<T> (operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
console.log(`${operation} failed: ${error.message}`);
return of(result as T);
};
}
Худшая частьявляется то, что я не могу отладить его локально, так как веб-сайт не работает, если он не размещен на серверах.Я не могу даже консольный журнал, чтобы увидеть, что на самом деле содержит токен.Я проверил много других связанных файлов и кода, проверил доступ к БД, и теперь я полностью потерян.Пожалуйста, пожалуйста, помогите, даже идея была бы отличной, все, что я мог бы исследовать, было бы замечательно.