我正在使用OAUTH API验证对用户Google日历的访问权限。他们没有使用OAUTH登录我的系统,只是接受我的网站访问他们的数据。
问题是,如果用户退出他们的谷歌帐户并且在他们点击验证后,它会强制将他们退出会话,我无法将他们连接起来。
如果他们已经在浏览器会话中登录到Google帐户并点击接受,则此功能正常工作,他们将被重定向到正确的页面。
当缓存,Cookie清楚且需要重新登录到他们的Google帐户进行验证时,我会复制错误。
我已尝试存储会话ID等,但请求参数不包含与初始视图相同的请求数据,因此我尝试检索的数据存在冲突。
用户使用标准Django库登录凭据模型。
FLOW = flow_from_clientsecrets(
CLIENT_SECRETS,
scope='https://www.googleapis.com/auth/calendar.readonly',
redirect_uri='http://127.0.0.1:8000/oauth2callback')
'''''''''''&#39 ;''''''''''''& #39;'''''''''''&#39 ;''''''''''''& #39;' 处理身份验证的主要功能 #&39;'''''''''''&# 39;'''''''''''' #&39;'''''''''''&# 39;'''''''''''' '
def index(request):
current_user = User.objects.get(username=request.user.username)
storage = Storage(CredentialsModel, 'id', current_user, 'credential')
credential = storage.get()
if credential is None or credential.invalid == True:
FLOW.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY,
request.user.id)
authorize_url = FLOW.step1_get_authorize_url()
return redirect(authorize_url)
'''''''''''&#39 ;''''''''''''& #39;'''''''''''&#39 ;''''''''''''& #39;''''''' 然后,用户在验证后调用数据函数 #&39;'''''''''''&# 39;'''''''''''' #&39;'''''''''''&# 39;
def auth_return(request):
print("THE CURRENTLY REQUESTED USER IN THIS SESSION REQUEST IS %s"%(request.user.username))
credential = FLOW.step2_exchange(request.REQUEST)
try:
current_user = User.objects.get(id=request.user.id)
except:
return HttpResponseRedirect("/login")
storage = Storage(CredentialsModel, 'id', current_user, 'credential')
storage.put(credential)
return HttpResponseRedirect("/get_cal")
答案 0 :(得分:0)
好的,所以这比我想的要多一些。
我通过添加当前登录用户名的状态参数来修复此问题。
logged_in_username = request.user.username
user_data = {'var_test' : logged_in_username}
pass_param = urllib.urlencode(user_data)
FLOW.params['state']=pass_param
authorize_url = FLOW.step1_get_authorize_url()
这使我能够通过Django contrib中的User模型从DB查询用户。我从URL解析了状态var:
#Get the currently logged in username
user_variable_data = str(FLOW.params['state'])
#get rid of the var_test= preprended text data for parsing reasons
user_variable_data = user_variable_data[9:]
#Get that user from the database in the form of a user object
current_user = User.objects.get(username=user_variable_data)
然后构建了一个自定义后端身份验证文件,以便在没有密码的情况下授权用户维护请求,就像没有任何奇怪的事情发生过一样。
user = authenticate(username=user_variable_data)
login(request, user)
print("AUTHENTICATED")
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'procrastinate.auth_backend.PasswordlessAuthBackend',
)
来自django.contrib.auth.backends导入ModelBackend 来自django.contrib.auth.models导入用户
class PasswordlessAuthBackend(ModelBackend): msgstr“”“在没有提供密码的情况下登录Django。
"""
def authenticate(self, username=None):
try:
return User.objects.get(username=username)
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None