【问题标题】:Authenticate restframework User in python在python中验证restframework用户
【发布时间】:2018-03-01 05:40:20
【问题描述】:

所以,我是 django 和 djangorestframework 的新手。我在他们的页面上关注了他们的教程。 http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/

在该教程中,您可以从 djangorestframework api 登录页面以 django 用户身份登录。我的问题是,如果我想制作 CLI 或 GUI 应用程序并使用请求模块将内容发布到 API,但必须先登录 API。我是怎么做到的?

【问题讨论】:

  • @neverwalkaloner ,这是从服务器端告诉的吧?客户端呢?如果我使用请求模块,如何传递令牌?
  • 类似response = requests.get('<MY_URI>', headers={'Authorization': 'Token <MY_TOKEN>'})。授权标头将对用户进行身份验证。
  • @neverwalkaloner 谢谢。我以某种方式让它工作。

标签: python django django-rest-framework


【解决方案1】:

在 DRF 中,您可以为简单的基于令牌的身份验证添加额外的包。将rest_framework.authtoken 添加到INSTALLED_APPS。要向客户端发出 HTTP(S) 请求,您需要传递这样的授权令牌 Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

为了测试,可以使用 curl

curl -X GET http://127.0.0.1:8000/api/example/ -H 'Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

Read more...

【讨论】:

  • 好的,谢谢。虽然有人已经发表了评论,我已经尝试过了。感谢您的回答
【解决方案2】:

您可以在 settings.py(在您的 Web 服务器项目中)中将用户必须始终进行身份验证作为默认设置:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),

关于here的更多信息。

在您的 Web 客户端项目中,就像您问题中提到的其中一个 cmets 一样,您必须在发送到 Web 服务器的 HTTP 消息中添加一个身份验证标头。一个示例(TypeScript Angular 应用程序实现)是:

import {Injectable} from '@angular/core';
import {HttpClient, HttpHeaders} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';
import {Spacecraft} from '../model/spacecraft';

/* Create the authentication headers for the HTTP requests to the DRF project's API.
 * Note: uses btoa(): base-64 encoding of ASCII string, see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa.
 */
const basicAuthenticationToken = btoa(environment.REST_API.username + ':' + environment.REST_API.password);
const httpOptions = {
  headers: new HttpHeaders({
    'Authorization': `Basic ${basicAuthenticationToken}`
  })
};

@Injectable()
export class APICommunicationService {

  constructor(private http: HttpClient,
              private notificationsService: NotificationsService) {
  }

  getSpacecraftInfo(url: string): Observable<Spacecraft> {
    return this.http.get<Spacecraft>(url, httpOptions)
  }
}

【讨论】:

  • 感谢您的回答。我决定采用其他答案,那就是通过令牌身份验证。我说的是像 PyQt 这样的 GUI 应用程序中的实现,但我根本没有学习 angular js。但我感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多