0

我目前正在努力整合Facebook Login到我的网站中。

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

因此,我的部分 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 视图的参数来避免它?

4

2 回答 2

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)

于 2013-06-30T11:06:45.830 回答
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))
于 2013-06-30T10:06:49.070 回答