从Javascript到Django视图的隐藏参数

时间:2013-06-30 08:04:21

标签: javascript django django-templates django-views

我目前正致力于将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))

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

2 个答案:

答案 0 :(得分:1)

我认为您不应该根据潜在攻击者无法看到的关键信息获取网址模式。应使用加密的ssl或tls请求中的POST请求方法将此类信息传递到服务器端。

但是对于您的用例,更好的方法是:

  1. 使用FB javascript api登录客户端并获取FB令牌
  2. 向您的后端发送POST https请求,并使用FB Graph Api让您的后端代码请求用户信息。 (在POST模式下传递access_token信息需要ssl和tls请求,这里是敏感数据)
  3. #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))
    

    #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)

答案 1 :(得分:0)

根据您的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))