Angular 2 登录到 Django Rest Framework 后端

标签 angular django-rest-framework django-rest-auth

我在前端使用 Angular 2,在后端使用 Django Rest Framework 来构建 Web 应用程序。

我已经设置了一个基本的 Angular 2 应用程序,它从我的 Django Rest Framework 后端提取数据。 Django Rest Framework 后端配置了“api-auth”url 以使用可浏览的 API 登录(请参阅 here 了解我的意思),但我现在在尝试登录时遇到麻烦我的 Angular 2 应用

据我所知,最佳做法是使用 JSON Web Tokens (JWT)。

我已经查看了几乎所有现成的在线教程/博客文章,但似乎无法找到一个明确的答案来总结我需要在后端 (Django) 和前端 (Angular 2) 上做什么。任何人都能够在高层次上解释如何从 Angular 2 前端登录到 Django Rest Framework 后端?

我特别考虑了一个“登录”功能,它位于 Angular 2 应用程序的“.service.ts”文件中,可以向某个 url“.../login”发出发布请求。请参阅 this blog 中的 login() 函数了解我的意思。我正在离开那个例子,但它并没有让我全面了解如何在前端和后端之间创建连接。

最佳答案

此解决方案用于使用 JWT 进行身份验证,但也有其他不使用 JWT 的解决方案。

This package (django-rest-framework-jwt) 允许您在 Django Rest Framework 中使用 auth 端点来管理 JWT。如果您遵循docs,您将不会遇到任何问题。 .

在 Angular2 端,您应该有一个登录服务,它会使用登录凭据从服务器请求 JWT。这取决于您在 Django 中的用户模型。

This blog post对 Angular2 JWT 身份验证非常有帮助。您可以在authentication.service中检查登录功能。我稍微更改了代码以更好地适应 DRF-jwt。

let headers = new Headers({
  'Accept': 'application/json',
  'Content-Type': 'application/json',
});
let options = new RequestOptions({
  headers: headers
});
this.http.post(basePath + '/api-token-auth/', JSON.stringify({ username: username, password: password }), options)
.map((response: Response) => {
      // login successful if there's a jwt token in the response
      let token = response.json() && response.json().token;

      if (token) {
        // set token property
        this.token = token;

        // store username and jwt token in local storage to keep user logged in between page refreshes
        localStorage.setItem('id_token', token);

        // return true to indicate successful login
        return true;
      } else {
        // return false to indicate failed login
        return false;
      }
    });
// 'api-token-auth/' is the default endpoint with drf-jwt

这从 drf 请求 jwt 并将其存储在 localStorage 中。

从那时起,您所有需要身份验证的 http 请求都应包含授权 header 。有一个 http wrapper这让你可以做到这一点。

您可以 override the default configuration settings .您需要覆盖的最低配置是您应该设置的是 globalHeaders。您不需要更改 tokenName 或 tokenGetter。只需添加 Content-Type: application/jsonAccept: application/json。 (DRF 将检查 Accept header 来决定它应该使用哪种 Renderer。)您可能还想将 headerPrefix 更改为 JWT 因为 drf-jwt 使用它授权 header 的前缀,或者您可以从 drf-jwt 的设置中更改它。

关于Angular 2 登录到 Django Rest Framework 后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41134534/

相关文章:

python - 邮件确认错误 rest-auth

mysql - 如何仅通过对服务器的单个请求来存储一些数据并可以在多个页面上使用?

angular - 单击时清除 Angular Material 自动完成

angular - 是否可以像使用模块一样在 Angular 2 中延迟加载组件?

django - Company 类型的对象在编写测试时不是 JSON 可序列化的

python - 您如何允许使用未经身份验证的请求访问 Django Rest Framework 中的某些 View ?

angular - NPM 5.0.1 更新后 ng 服务错误 : Invalid Version:

javascript - POST 使用 Postman 但不是通过 JavaScript 中的 fetch

python - django-rest-auth 注册/验证电子邮件/不工作

python - Django rest 基本身份验证问题(HTTP 400)