Получение «TypeError: Невозможно прочитать свойство« split »из неопределенного в JwtHelperService» при попытке войти в систему с помощью Angular - PullRequest
0 голосов
/ 26 сентября 2019

Это устаревшее приложение, которое все еще использует мое рабочее место, которое недавно случайно перестало работать.Он берет данные из базы данных и отображает их для всех.Первоначально я думал, что это ключ 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);
    };
  }

Худшая частьявляется то, что я не могу отладить его локально, так как веб-сайт не работает, если он не размещен на серверах.Я не могу даже консольный журнал, чтобы увидеть, что на самом деле содержит токен.Я проверил много других связанных файлов и кода, проверил доступ к БД, и теперь я полностью потерян.Пожалуйста, пожалуйста, помогите, даже идея была бы отличной, все, что я мог бы исследовать, было бы замечательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...