我目前正致力于将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视图的参数来避免它?
答案 0 :(得分:1)
我认为您不应该根据潜在攻击者无法看到的关键信息获取网址模式。应使用加密的ssl或tls请求中的POST请求方法将此类信息传递到服务器端。
但是对于您的用例,更好的方法是:
#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))