首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google + django -无法根据保存的数据进行身份验证

Google + django -无法根据保存的数据进行身份验证
EN

Stack Overflow用户
提问于 2022-06-03 14:48:08
回答 1查看 109关注 0票数 0

好的,所以我让流正常工作,但是它只在当前的会话中工作,如果我尝试加载数据,即使只是刷新,凭证也不能保持。

因此,这是oauth在用户接受提示后重定向到的地方:

代码语言:javascript
复制
def oauth_redir(request):
    u=Employee.objects.filter(dashboard_user=request.user)
    if not u:
        u=Employee.objects.create(dashboard_user=request.user)
    else:
        u=u[0]
    flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
        CLIENT_SECRETS_FILE, scopes=SCOPES, state=request.GET.get("state"))
    flow.redirect_uri = REDIRECT_URL
    flow.fetch_token(authorization_response=request.build_absolute_uri().replace("http:","https:"))

    #saving credentials for future use
    credentials = flow.credentials
    if not Emp_google_creds.objects.filter(employee=u):
        Emp_google_creds.objects.create(
        token= credentials.token,
        refresh_token= credentials.refresh_token,
        token_uri = credentials.token_uri,
        client_id = credentials.client_id,
        client_secret= credentials.client_secret,
        scopes = " ".join(credentials.scopes),
        employee = u
        )
    else:
        creds=Emp_google_creds.objects.get(employee=u)
        creds.token = credentials.token,
        creds.refresh_token = credentials.refresh_token,
        creds.token_uri = credentials.token_uri,
        creds.client_id = credentials.client_id,
        creds.client_secret = credentials.client_secret,
        creds.scopes = " ".join(credentials.scopes),
        creds.save()


    if not credentials or not credentials.valid:
        print(credentials, credentials.valid, credentials.expiry)
        # credentials.refresh(Request())
        # return redirect("/calendar/cal_auth/")
    try:
        service = googleapiclient.discovery.build('calendar', 'v3', credentials=credentials)

        # Call the Calendar API
        now = datetime.datetime.utcnow().isoformat() + 'Z'  # 'Z' indicates UTC time
        print('Getting the upcoming 10 events')
        events_result = service.events().list(calendarId='primary', timeMin=now,
                                              maxResults=10, singleEvents=True,
                                              orderBy='startTime').execute()
        events = events_result.get('items', [])

        if not events:
            print('No upcoming events found.')
            return

        # Prints the start and name of the next 10 events
        for event in events:
            start = event['start'].get('dateTime', event['start'].get('date'))
            print(start, event['summary'])

    except HttpError as error:
        print('An error occurred: %s' % error)
    print("end of redir func")
    return render(request,"schedule.html")

这将按预期加载计划。但是,如果您为了使用存储的凭据而刷新它们,它们永远不会刷新,我不知道该做什么。

代码语言:javascript
复制
def calendar_home(request):
    u = Employee.objects.filter(dashboard_user=request.user)
    if not u:
        u = Employee.objects.create(dashboard_user=request.user)
    else:
        u = u[0]

    print(Emp_google_creds.objects.filter(employee=u))
    if not Emp_google_creds.objects.filter(employee=u):
        return redirect("/calendar/cal_auth/")
    else:
        creds=Emp_google_creds.objects.filter(employee=u)[0]
        gcreds=google.oauth2.credentials.Credentials.from_authorized_user_info(creds.to_dict())
        if not gcreds or not gcreds.valid:
            print(gcreds, gcreds.valid, gcreds.expiry)
            # gcreds.refresh(Request())
            return redirect("/calendar/cal_auth/")
        try:
            service = googleapiclient.discovery.build('calendar', 'v3', credentials=gcreds)

            # Call the Calendar API
            now = datetime.datetime.utcnow().isoformat() + 'Z'  # 'Z' indicates UTC time
            print('Getting the upcoming 10 events')
            events_result = service.events().list(calendarId='primary', timeMin=now,
                                                  maxResults=10, singleEvents=True,
                                                  orderBy='startTime').execute()
            events = events_result.get('items', [])

            if not events:
                print('No upcoming events found.')
                return

            # Prints the start and name of the next 10 events
            for event in events:
                start = event['start'].get('dateTime', event['start'].get('date'))
                print(start, event['summary'])

        except HttpError as error:
            print('An error occurred: %s' % error)
    return render(request,"schedule.html")

基本上如下:

代码语言:javascript
复制
print(gcreds, gcreds.valid, gcreds.expiry) => 
<google.oauth2.credentials.Credentials object at 0x7f322a00b340> False 2022-06-03 14:44:02.232624

如果我评论重定向,我会得到:

代码语言:javascript
复制
('invalid_client: The OAuth client was not found.', {'error': 'invalid_client', 'error_description': 'The OAuth client was not found.'})

在这条线上引起的:

代码语言:javascript
复制
events_result = service.events().list(calendarId='primary', timeMin=now, ... 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-03 20:28:23

上个星期我刚刚经历了这一切。也许可以尝试手动构建凭据,就像我所做的那样,而不是使用Credentials.from_authorized_user_info()。我发现谷歌喜欢在不更新文档的情况下改变事情。

代码语言:javascript
复制
    user_creds = json.loads(Emp_google_creds.objects.filter(employee=u)[0])
    creds=Credentials(
    token=user_creds['token'],
    refresh_token=user_creds['refresh_token'],
    token_uri=user_creds['token_uri'],
    client_id=user_creds['client_id'],
    client_secret=user_creds['client_secret']
    )
    service = build('calendar', 'v3', credentials=creds)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72491364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档