Странное поведение модуля oauth2client.tools для iOS во время аутентификации Google API - PullRequest
0 голосов
/ 29 апреля 2020

Попытка доступа к Google Диску с помощью oauth2client.tools для приложения iOS. (Среда Kivy / Python) Следующий код отлично работает для среды ОС Ma c,

  1. Для первого доступа он создает учетные данные. json при успешной аутентификации и
  2. Для 2-го или более позднего доступа он использует существующие учетные данные. json для обхода процедуры аутентификации

Однако, когда тот же код используется для приложения iOS, результат на iPhone для 1. меняется каждый раз, что вызывает у меня проблему.

  • иногда генерирует учетные данные. json успешно,

  • иногда Google два пошаговая проверка не дает ответа после всех процедур аутентификации в веб-браузере

  • иногда X-Code внезапно отключает iPhone.

Во втором случае я получаю следующее сообщение об ошибке.

Ошибка завершения буфера команды GLDRendererMetal: Ошибка Domain = MTLCommandBufferErrorDomain Code = 7 "Недостаточно прав доступа (для отправки работы графического процессора из фон) (код IOAF 6) "UserInfo = {NSLocalizedDescription = Недостаточно прав (для отправки работы графического процессора из фона) (код 6 IOAF)}

Также во многих случаях я также получаю следующую ошибку.

XP C соединение прервано

Есть ли какие-либо рекомендации по этому вопросу?

Среда: - Python 3.7.2 (появилось второе сообщение при изменении формы с 3.7.1 на 3.7.2) - X-код 11.4.1 - iPhone 7 и iPhone Xs

Python код

# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from apiclient import discovery
from httplib2 import Http
from oauth2client import client, file, tools
import os

sm = ScreenManager()


class MyLayoutAuthEntrance(BoxLayout):
    pass


class GoogleAuthEntranceScreen(Screen):
    # define path variables
    app_dir = App().user_data_dir + "/oauth2test"
    credentials_file_path = os.path.join(app_dir, "credentials.json")
    clientsecret_file_path = "./credentials/client_secret.json"
    if os.path.isdir(app_dir) == False:
        os.mkdir(app_dir)
    dialog_number = 0

    def __init__(self, **kwargs):
        super(GoogleAuthEntranceScreen, self).__init__(**kwargs)
        self.gridlayout = None
        self.gridlayout = MyLayoutAuthEntrance()
        self.add_widget(self.gridlayout)

    def button_yes_clicked(self, *args):
        self.drive = self.authentication_process()

    def button_no_clicked(self, *args):
        exit(0)

    def authentication_process(self):

        # define API scope
        # SCOPE = "https://www.googleapis.com/auth/drive"
        SCOPE = [
            "https://www.googleapis.com/auth/drive.metadata.readonly",
            "https://www.googleapis.com/auth/drive.file",
            "https://www.googleapis.com/auth/drive",
        ]

        # define store
        store = file.Storage(self.credentials_file_path)
        credentials = store.get()
        # get access token
        if not credentials or credentials.invalid:
            flow = client.flow_from_clientsecrets(
                self.clientsecret_file_path,
                scope=SCOPE,
                redirect_uri="urn:ietf:wg:oauth:2.0:oob:auto",
            )
            credentials = tools.run_flow(flow, store)

        if credentials != None:
            self.gridlayout.authlabel.text = "Authentication successfully made!"
        else:
            self.gridlayout.authlabel.text = "Authentication failed!"


class oauth2testApp(App):
    def build(self):

        self.gae_screen = GoogleAuthEntranceScreen(name="gae_screen")
        sm.add_widget(self.gae_screen)
        sm.current = "gae_screen"
        return sm


if __name__ == "__main__":
    oauth2testApp().run()

код Киви

# -*- coding: utf-8 -*-
<GoogleAuthEntranceScreen>:
    BoxLayout:
        orientation: 'vertical'
        padding: 10,40,10,40 
        spacing: 40 

<MyLayoutAuthEntrance>:
    authlabel: authlabel
    orientation: 'vertical'
    Label:
        id:authlabel
        text: 'Press "Yes" for authentication!'
    BoxLayout:
        orientation: 'horizontal'
        Button:
            text:'NO'
            on_release: root.parent.button_no_clicked()
        Button:
            text: 'YES'
            on_release: root.parent.button_yes_clicked()  
    Label:
        text: ''
...