oauth2 django应用中的用户会话

时间:2014-10-24 14:05:53

标签: python django session

我使用django,django rest framework和ember.js;我的整个应用程序都通过ajax进行通信。

通过oauth2完成身份验证,并在每个请求中的标头中发送令牌。

Everythings漂亮而有光泽但文件下载。

用户可以下载pdf并且我不知道如何在那里应用身份验证 - 因为在文件下载时我无法发送和标题,它只是一个链接。

我想将SessionAuthentication添加到该特定的rest api调用,但会话始终将传入的用户标记为任意名称。

如何强制django在oauth2令牌流之上创建会话?

我尝试了login(request, user),但它不知何故没有开始。

1 个答案:

答案 0 :(得分:0)

我结束了签名的门票,例如我发回一个令牌,它能够在规定的时间范围内绕过身份验证。因此,ajax应用程序可以首先请求令牌,然后再次触发附加了令牌的标准get请求。

这是基本的想法,我混合到观点:

class DownloadableMixin():
    """
    Manages a ticket response, where a ticket is a signed response that gives a user limited access to a resource
    for a time frame of 5 secs.

    Therefore, file downloads can request a ticket for a resource and gets a ticket in the response that he can
    use for non-ajax file-downloads.
    """

    MAX_AGE = 5

    def check_ticket(self, request):
        signer = TimestampSigner()
        try:
            unsigned_ticket = signer.unsign(request.QUERY_PARAMS['ticket'], max_age=self.__class__.MAX_AGE)
        except SignatureExpired:
            return False
        except BadSignature:
            return False

        if self.get_requested_file_name() == unsigned_ticket:
            return True
        return False

    def get_ticket(self):
        signer = TimestampSigner()
        return signer.sign(self.get_requested_file_name())

    def has_ticket(self, request):
        return 'ticket' in request.QUERY_PARAMS

    def requires_ticket(self, request):
        return 'download' in request.QUERY_PARAMS

    def get_requested_file_name(self):
        raise NotImplementedError('Extending classes must define the requested file name.')