【问题标题】:Do not require authentication for GET requests from browser不需要对来自浏览器的 GET 请求进行身份验证
【发布时间】:2015-07-08 20:46:46
【问题描述】:

这个问题与Do not require authentication for OPTIONS requests密切相关

我的设置.py

REST_FRAMEWORK = {
    'UNICODE_JSON': True,
    'NON_FIELD_ERRORS_KEY': '__all__',
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'platformt_core.something.permissions.DjangoObjectPermissionsOrOptions',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'ALLOWED_VERSIONS': ['v1'],
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning',
    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
    'TEST_REQUEST_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

platformt_core/something/permissions.py

from rest_framework.permissions import DjangoObjectPermissions

OPTIONS_METHOD = 'OPTIONS'

class DjangoObjectPermissionsOrOptions(DjangoObjectPermissions):
    def has_permission(self, request, view):
        if request.method == OPTIONS_METHOD:
            return True
        else:
            return super(DjangoObjectPermissions, self).has_permission(request, view)

当我从浏览器发出这个请求时:

GET /api/passenger/v1/order/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=3XytVl8Oh2PJxcSs1ufI9TIZMOTC5Pix

我期待像 http://www.django-rest-framework.org/topics/documenting-your-api/ 中描述的“自我描述 API”这样简洁的东西

但是我得到了:

HTTP/1.0 401 UNAUTHORIZED
Date: Wed, 08 Jul 2015 20:45:23 GMT
Server: WSGIServer/0.1 Python/2.7.6
Content-Type: application/json;q=0.8; charset=utf-8
WWW-Authenticate: Token
Allow: POST, OPTIONS

{"detail":"Authentication credentials were not provided."}

有没有一种巧妙的方法来实现这一目标?我的意思是我希望有可浏览的 API,但 API 请求仍应通过身份验证来保护。

【问题讨论】:

  • 401 响应并不令人惊讶 - 您的浏览器正在执行 GET 请求,但您创建的权限类只允许来自未经身份验证的用户的 OPTIONS 请求。请注意,浏览器通常只会执行 GETPOST 请求。
  • @Alasdair 浏览器可以执行其他请求,如果您告诉它们(例如使用 AJAX 时)。
  • @KevinBrown 我不认为说“浏览器通常只会执行 GET 或 POST 请求”具有误导性。浏览器不会访问 API 允许的 OPTIONS 请求,除非 OP 采取措施实现这一点。感谢您澄清在执行 ajax 时可以使用其他请求类型。

标签: django django-rest-framework


【解决方案1】:

你不能直接用吗?

'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticatedOrReadOnly',)

这将允许未经身份验证的用户进行只读访问。

【讨论】:

  • 带有警告 - 需要查询集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2012-06-13
  • 2014-12-24
  • 1970-01-01
相关资源
最近更新 更多