0

我的Angular SPA應用程序由需要基本身份驗證的Apache服務器提供。 該應用程序還需要使用需要基本身份驗證(相同憑據)的REST API從Apache服務器獲取基本認證憑證,以嵌入到Angular SPA中?

因此,當用戶第一次導航到頁面時,他必須在服務器甚至會發送Angular應用程序之前提供其憑據。但是,一旦用戶獲得應用程序,應用程序就不知道用什麼憑證來訪問REST API。我必須向用戶展示第二個登錄頁面,以便應用程序可以將身份驗證憑據存儲在cookie或localStorage中。

有沒有什麼辦法讓服務器用Angular SPA「嵌入」用戶的$ _SERVER ['PHP_AUTH_USER']和$ _SERVER ['PHP_AUTH_PASSWORD'],這樣用戶不必登錄兩次?

例如像:

  • 用戶導航到index.php包裝
  • PHP包裝酷似index.html的,除了它也存儲PHP_AUTH憑據localStorage的

<body> 
 
    <script> 
 
     localStorage.setItem("auth_token", "<?php base64_encode($_SERVER['PHP_AUTH_USER'].":".$_SERVER['PHP_AUTH_PASSWORD']); ?>"); 
 
    </script> 
 
    <app-root></app-root> 
 
... 
 
</body>

  • 角會從localStorage的的頭憑據REST API

getProject(): Promise<Project> { 
 
     let auth_token = localStorage.getItem('auth_token'); 
 
     let headers = new Headers(); 
 
     headers.append('Authorization', 'Basic ' + auth_token); 
 
     let options = new RequestOptions({headers: headers}); 
 
     return this.http 
 
      .get(this.restApiUrl, options) 
 
      .toPromise() 
 
      .then(response => response.json().data as Project) 
 
      .catch(this.handleError); 
 
    }

(這個解決方案沒有奏效。即使輸入我的憑證,我也會得到401授權。)

回答

0

base64_encode返回一個字符串或false。它不打印輸出。爲此,您可以使用echo。您可以通過查看腳本標記中呈現的頁面的來源來驗證這一點。 localStorage.setItem("//php didn't output anything here")

echo base64_encode($_SERVER['PHP_AUTH_USER'].":".$_SERVER['PHP_AUTH_PASSWORD']);