从Apache服务器检索基本身份验证凭据,嵌入Angular SPA?

时间:2017-08-11 20:28:36

标签: angular authentication basic-authentication jira-rest-api

我的Angular SPA应用程序由需要Basic Auth的Apache服务器提供服务。 该应用程序还需要使用需要Basic Auth(相同凭据)的REST API

因此,当用户首次导航到该页面时,他必须在服务器甚至发送Angular应用程序之前提供其凭据。但是,一旦用户获得应用程序,该应用程序就不知道用于访问REST API的凭据。我必须向用户显示第二个登录页面,因此应用程序可以将身份验证凭据存储在cookie或localStorage中。

我有什么方法可以让服务器&#34;嵌入&#34;用户使用Angular SPA的$ _SERVER [&#39; PHP_AUTH_USER&#39;]和$ _SERVER [&#39; PHP_AUTH_PASSWORD&#39;],因此用户不必登录两次?< / p>

例如:

  • 用户导航到index.php wrapper
  • PHP包装器与index.html完全相同,只是它还将PHP_AUTH凭据存储到localStorage

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

  • Angular从localStorage获取凭据以获取标头到REST API

&#13;
&#13;
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);
    }
&#13;
&#13;
&#13;

(这个解决方案没有用。即使我输入凭据,我也需要401授权。)

1 个答案:

答案 0 :(得分:0)

base64_encode返回字符串或false。它不打印输出。为此,您可以使用echo。您可以通过查看脚本标记中呈现页面的来源来验证这一点。 localStorage.setItem("//php didn't output anything here")

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