如何检查该用户是不是已通过来自美味派的身份验证?

Posted

技术标签:

【中文标题】如何检查该用户是不是已通过来自美味派的身份验证?【英文标题】:How do I check that user already authenticated from tastypie?如何检查该用户是否已通过来自美味派的身份验证? 【发布时间】:2011-11-13 21:00:54 【问题描述】:

当用户在 Django 中进行身份验证时,我如何从 sweetpie 中检查?

一旦用户登录,该视图会包含一些从 API 中提取数据的 JS,这些数据由美味派支持。

我的资源上设置了基本身份验证/djangoauthorisation,因此浏览器会弹出 http auth 窗口。有什么办法可以避免吗?

到目前为止,我的想法是扩展 BasicAuthentication 以便它首先检查会话数据,当它没有找到它时,它会退回到 http auth? AFAIK AJAX 调用包括会话 cookie,所以理论上这应该有效吗?有人做过类似的吗?

【问题讨论】:

【参考方案1】:

到目前为止我有这个解决方案:

class MyBasicAuthentication(BasicAuthentication):
    def __init__(self, *args, **kwargs):
        super(MyBasicAuthentication, self).__init__(*args, **kwargs)

    def is_authenticated(self, request, **kwargs):
        from django.contrib.sessions.models import Session
        if 'sessionid' in request.COOKIES:
            s = Session.objects.get(pk=request.COOKIES['sessionid'])
            if '_auth_user_id' in s.get_decoded():
                u = User.objects.get(id=s.get_decoded()['_auth_user_id'])
                request.user = u
                return True
        return super(MyBasicAuthentication, self).is_authenticated(request, **kwargs)

这似乎符合我的要求。如果用户已登录,则 session 包含_auth_user_id,如果没有,则缺少密钥。

谁能想到这种方法可能导致的任何问题?

【讨论】:

【参考方案2】:

您可能想在 sweetpie 的 GitHub 上查看这张票:

https://github.com/toastdriven/django-tastypie/issues/197

作者提出了一种非常简洁的方法来使用会话和 API 密钥方法对调用进行身份验证。

sn-p 出现了:

class ApiKeyPlusWebAuthentication(ApiKeyAuthentication):
def is_authenticated(self, request, **kwargs):
    if request.user.is_authenticated():
        return True

    return super(ApiKeyPlusWebAuthentication, self).is_authenticated(request, **kwargs)

def get_identifier(self, request):
    if request.user.is_authenticated():
        return request.user.username
    else:
        return super(ApiKeyPlusWebAuthentication, self).get_identifier(request)

【讨论】:

【参考方案3】:

一旦用户通过您的 API 登录,您就有了一个 Django 用户会话。如果您想检查用户是否仍然登录(例如在页面刷新时)。你可以这样做:

from tastypie.resources import Resource

class LoggedInResource(Resource):
    class Meta:
        pass

    def get_list(self, request, **kwargs):

        from django.http import HttpResponse

        if request.user.is_authenticated():
            return HttpResponse(status=200)
        else:
            return HttpResponse(status=401)

客户检查:

$.ajax(
    type: "GET",
    url: '/api/loggedin/',
    success: function(data) 
        // logged in
    ,
    error: function() 
        // not logged in
    
);

【讨论】:

【参考方案4】:

芍药

为什么不简单如下:

class CommAuthentication(BasicAuthentication):
    def __init__(self, *args, **kwargs):
        super(CommAuthentication, self).__init__(*args, **kwargs)

    def is_authenticated(self, request, **kwargs):
        return request.user.is_authenticated()

我刚开始学习美味派。上面的代码似乎对我有用。您的解决方案有什么优势吗?

【讨论】:

我认为这只有在请求已经过身份验证并且已设置会话 cookie 时才有效。如果您发送设置了 HTTP Basic Auth 标头的请求,这将失败,因为没有会话并且您没有调用超类 is_authenticated 方法,该方法应该可以处理这种情况。 感谢 Pulegium。 “我认为这只有在请求已经过身份验证的情况下才有效”,难道不希望以这种方式以编程方式访问 API 吗?就身份验证而言,最佳实践是什么?目前我有一个单独的登录 api 来验证用户。只有成功通过登录api的用户才能使用其他的restful api。不确定这种做法是否可行。 顺便说一句,在我的登录 api 中我启动了 session-cookie 我对 RESTful API 的理解是不应该维护任何状态(或会话)。换句话说,您在请求中提供的信息应该足以处理它。这意味着,您必须在每个请求中发送登录信息(作为 HTTP 基本身份验证或 API 密钥)。

以上是关于如何检查该用户是不是已通过来自美味派的身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是不是通过 Laravel 上的 cookie 会话进行身份验证?

Laravel sanctum 检查用户是不是在没有重定向的情况下通过身份验证

如何在 Perl 中使用 POE::Component::IRC::State 检查用户是不是通过 NickServ 的身份验证?

Vue SPA - 检查用户是不是通过身份验证,如果没有则重定向到登录

检查用户是不是在 Android 的 Firebase Google 身份验证中首次通过身份验证

如何检查来自另一个 keycloak 实例 B 的身份验证 keycloak 实例 A 用户?