【问题标题】:Hidden arguments from Javascript to Django view从 Javascript 到 Django 视图的隐藏参数
【发布时间】:2013-06-27 15:01:08
【问题描述】:

我目前正在努力将Facebook Login 集成到我的网站中。

在 javascript 中,我能够在用户登录我的网站的那一刻获取用户的信息;通过 Facebook。

所以,我的部分 javascript 代码如下:

...
u_email = response.email;      //gets user's email
u_fname = response.first_name; //gets user's first name

...等等!

现在我想做以下两种情况之一:1)如果这是用户第一次登录我的网站;我想将所有这些信息(电子邮件、名字……)保存到我的用户数据库中; 2)如果这不是用户第一次登录,我想将用户重定向到另一个页面,并显示一些我需要从数据库中获取的关于他/她的信息(根据他/她的电子邮件) !

在任何一种情况下,我都必须通过用户信息来访问数据库。所以,我想做的是在传递用户信息的同时将用户重定向到 Django 视图。例如,我的 javascript 文件中可以包含以下内容:

document.location.href = '../' + u_email +'/' + u_fname + '/login';

...在我的urls.py 中,我可以拥有以下内容:

url(r'^(?P<u_email>\w+)/(?P<u_fname>\w+)/login/$', views.login, name='login')

最后,在我的view 文件中,我可以拥有以下内容:

def login(request, u_email, u_fname):
    template = loader.get_template('counters/login.html')
    context = RequestContext(request, {
        'u_email': u_email,
        'u_fname': u_fname,
})
return HttpResponse(template.render(context))

现在;显然,我有一个问题,就是用户的(据说是保密的)信息会显示在url中!有没有办法通过隐藏从 javascript 传递到 Django 视图的参数来避免它?

【问题讨论】:

    标签: javascript django django-templates django-views


    【解决方案1】:

    我认为你不应该有基于潜在攻击者不应该看到的关键信息的 url 模式。此类信息应在加密的 ssl 或 tls 请求中使用 POST 请求方法传递到服务器端。

    但对于您的用例,实现这一目标的更好方法是:

    1. 使用 FB javascript api 在客户端登录并获取 FB 令牌
    2. 向您的后端发送一个 POST https 请求,并让您的后端代码使用 FB Graph Api 请求用户信息。 (ssl 和 tls 请求是在 POST 模式下传递 access_token 信息所必需的,这里是敏感数据)

    
    
    
    #the view code
    #import your user model here
    import requests
    from django.shortcuts import render_to_response
    
    @POST_required
    def login(request, facebookId):
        if token is not None:
            #query graph api
            r = requests.get('https://graph.facebook.com/{facebook_id}?fields=email,name&access_token={token}'.format({'facebook_id':facebook_id, 'token':token}))
            facebook_email = r.json()['email']
            facebook_name = r.json()['name']
    
            #check if first login
            try:
                user = Users.object.get(email=facebook_email, name=facebook_name)
            except Users.DoesNotExist:
                user = Users.objects.create(email=facebook_email, name=facebook_name)
            render_to_response('counter/login.html', dictionnary={'user':user}, context=RenderContext(request))
    

    #url conf code from django.conf.urls import patterns, url import views url_patterns = url('', patterns(r'^(?Pw+)/login/$', views.login)

    【讨论】:

    • 非常好:) - 谢谢!你知道是否有可能(如果这是一个好主意)立即从 Django(视图)登录(类似于 http 请求)并且根本不使用 JavaScript!我只是好奇!
    • 顺便说一句;你不需要在'def login(request, facebookId, [here])'的参数列表中添加'token'吗?
    • 是的,对不起,我忘记了:因为它是一个 POST 参数,只需使用 request.POST 字典(request.POST['token'])检索它
    【解决方案2】:

    根据你有一个Model来保存User的信息,他的email是唯一的。

    def login(request, u_email, u_fname):
        try:
            # Try to get the User in your DB
            user = YourUserModel.objects.get(email=u_email)
            # Do your redirects.
        except YourUserModel.DoesNotExist:
            # Do your other stuffs, like add this new user in your DB
    
        template = loader.get_template('counters/login.html')
        context = RequestContext(request, {
            'u_email': u_email,
            'u_fname': u_fname,
        })
        return HttpResponse(template.render(context))
    

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多