我正在使用 OAUTH API 来验证对用户谷歌日历的访问权限。他们没有使用 OAUTH 登录我的系统,只是接受我的网站访问他们的数据。
问题是,如果用户退出他们的谷歌帐户并且在他们点击验证后,它会强制他们退出他们的会话,我无法将它们链接起来。
如果他们已经在浏览器会话中登录到谷歌帐户并点击接受,这确实有效,他们将被重定向到正确的页面。
当缓存、cookie 被清除并且他们需要重新登录到他们的谷歌帐户进行验证时,我复制了错误。
我尝试存储会话 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')
''''''''''''''''''''''''''''''''''''''''''''' '主函数处理auth验证'''''''''''''''''''''''''''''''''''''''' ''''''''
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)
''''''''''''''''''''''''''''''''''''''''''''' ''''''' 用户通过身份验证后调用数据函数 ''''''''''''''''''''''''''''''''' '''
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")