German Problem mit oAuth2

mw71

Active Member
Licensed User
Longtime User
Hallo zusammen

Goggle hat ja mal wieder geändert so das oAuth2 nicht mehr über den WebView funktioniert.
Ich habe mir deshalb diese Class in mein Programm geladen:
https://www.b4x.com/android/forum/threads/class-b4x-google-oauth2.79426/

- Client ID ist vorhanden
- Manifest habe ich ergänzt
- da ich auf das Drive und nicht auf die Persönlichen Daten zugreifen möchte habe ich den Aufruf folgendermaßen gemacht (leicht abgewandelt)
B4X:
Dim oAuth As GoogleOAuth2
Dim scope As String
Dim clientID As String

scope = "https://www.googleapis.com/auth/drive"
clientID = "xxx-xxxxxxxl.apps.googleusercontent.com"

oAuth.Initialize(Me,"oauth",clientID,scope)

Rufe ich nun Request Token (oAuth.GetAccessToken) auf, gelange ich zum Browser (Crome) wo ich mich dann einloggen kann
und die Freigabe erteilen kann. Danach leitet er mich aber auf die Google Startseite weiter und somit kann die Class auch keien Access Token "abgreifen"

ich hoffe es kann jemand helfen,
Danke
 

DonManfred

Expert
Licensed User
Longtime User
Wir werden unsere Private Conversation HIER weiter führen.

Ich persönlich gebe gerne mein Wissen weiter aber ich mag es nicht in einer Privaten Conversation.

Aus diesem Grund habe ich Marc gebeten unser Gespräch HIER weiter zu führen....

----------------------------------------------------------------

"update"

B4X:
Dim h As HttpJob
    Dim m As Map : m.Initialize

    Dim j As JSONGenerator
    Dim data() As Byte

    m.Put("name", FolderName)
    m.Put("mimeType", "application/vnd.google-apps.folder")

    j.Initialize(m)
    Log(j.ToString)
  
    data = (j.ToString).GetBytes("UTF-8")

    h.Initialize("",Me)
    'h.PostMultipart("https://www.googleapis.com/upload/drive/v3/files", m ,Null)
    h.PostBytes("https://www.googleapis.com/upload/drive/v3/files",data)
    h.GetRequest.SetHeader("Authorization", "Bearer " & myToken)
    h.GetRequest.SetHeader("Content-Type", "application/json")
  
    wait For (h) JobDone(h As HttpJob)
  
    If h.Success Then
        Log(h.GetString)
    End If
nach dem ich herausgefunden habe wie ich den Token in den Header bekomme, kann ich jetzt ein "File" anlegen
(welches ein Ordner sein soll). Das Problem dabei ist, das er im Moment den Namen den ich Übergebe nicht akzeptiert
(er erstellt untitelt) und zum anderen erkennt er den mimeType nicht, so das es kein Ordner wird, sondern ein undefiniertes File.
 

mw71

Active Member
Licensed User
Longtime User
Hallo,

Manfred hat natürlich recht, das gehört wieder in's Forum.

Das ursprüngliche Problem konnte gelöst werden. Mein Paketname war Groß und klein geschrieben. Nachdem ich irgendwo gelesen habe das der Paketname traditionell klein geschrieben wird und ich dies auch so gemacht habe funktionierte es. Das kann jetzt noch zu anderen Problemen führen, aber das muss ich später erst noch schauen.

Danach ging es daran den Zugriff auf Google Drive zu schreiben.

Suchen nach Folder/Files und Ausgabe einer FileListe gehen mittlerweile
(falls jemand Interesse hat...sicherlich noch optimierungsfähig)
B4X:
Sub SearchForFolderID(suchFolder As String, parrent As String)
Log("-------------------")
Log("SearchForFolerID")
Log("Folder:" & suchFolder)
Log("Parrent:" & parrent)

    Dim H As HttpJob
    h.Initialize("", Me)
    If parrent="" Then
        h.Download2("https://www.googleapis.com/drive/v3/files", _
             Array As String("access_token", myAccessToken, _
                             "corpora", "user", _
                             "q","mimeType='application/vnd.google-apps.folder' and" & _
                             "name='" & suchFolder & "' and " & _
                             "trashed=false"))
    Else
        h.Download2("https://www.googleapis.com/drive/v3/files", _
             Array As String("access_token", myAccessToken, _
                             "corpora", "user", _
                             "q","mimeType='application/vnd.google-apps.folder' and" & _
                             "name='" & suchFolder & "' and " & _
                             "'" & parrent & "' in parents and " & _
                             "trashed=false"))
    End If
    Wait For (h) JobDone(h As HttpJob)
   
    If h.Success Then
        Log(h.GetString)
        Dim j As JSONParser
        Dim Map1,fileEntry As Map
        Dim files As List
       
        J.Initialize(h.GetString)
        files.Initialize
        Map1 = J.NextObject
        files = Map1.Get("files")
        h.Release
       
        For i = 0 To files.Size - 1
            fileEntry = files.Get(i)
            If  fileEntry.Get("name") = suchFolder And _
                fileEntry.Get("mimeType") = "application/vnd.google-apps.folder" Then
                CallSub2(evModule, evName & "_FolderFound", fileEntry.Get("id"))
                Return
            End If
        Next
        CallSub2(evModule, evName & "_FolderFound", "")
    End If
End Sub


Sub SearchForFileID(suchFile As String, parrent As String)
    Log("-------------------")
    Log("SearchForFIleID")
    Log("File:" & suchFile)
    Log("Parrent" & parrent)

    Dim H As HttpJob
    h.Initialize("", Me)
    If parrent="" Then
        h.Download2("https://www.googleapis.com/drive/v3/files", _
             Array As String("access_token", myAccessToken, _
                             "corpora", "user", _
                             "q","mimeType!='application/vnd.google-apps.folder' and" & _
                             "name='" & suchFile & "' and " & _
                             "trashed=false"))
    Else
        h.Download2("https://www.googleapis.com/drive/v3/files", _
             Array As String("access_token", myAccessToken, _
                             "corpora", "user", _
                             "q","mimeType!='application/vnd.google-apps.folder' and" & _
                             "name='" & suchFile & "' and " & _
                             "'" & parrent & "' in parents and " & _
                             "trashed=false"))
    End If
   
    If h.Success Then
        Log(h.GetString)
        Dim j As JSONParser
        Dim Map1,fileEntry As Map
        Dim files As List
       
        J.Initialize(h.GetString)
        files.Initialize
        Map1 = J.NextObject
        files = Map1.Get("files")
        H.Release

        For i = 0 To files.Size - 1
            fileEntry = files.Get(i)
            If  fileEntry.Get("name") = suchFile Then
                CallSub2(evModule, evName & "_FileFound", fileEntry.Get("id"))
                Return
            End If
        Next
        CallSub2(evModule, evName & "_FolderFound", "")
    End If
End Sub


Sub ShowFileList(parrent As String)
    Log ("Show the File List")

    Dim H As HttpJob
    h.Initialize("", Me)
    If parrent="" Then
        h.Download2("https://www.googleapis.com/drive/v3/files", _
             Array As String("access_token", myAccessToken, _
                             "corpora", "user", _
                             "q","mimeType!='application/vnd.google-apps.folder' and" & _
                             "trashed=false"))
    Else
        h.Download2("https://www.googleapis.com/drive/v3/files", _
             Array As String("access_token", myAccessToken, _
                             "corpora", "user", _
                             "q","mimeType!='application/vnd.google-apps.folder' and" & _
                             "'" & parrent & "' in parents and " & _
                             "trashed=false"))
    End If
    Wait For (h) JobDone(h As HttpJob)
   
    If h.Success Then
        Log(h.GetString)

        Dim FilelisteExport As List
        Dim Map1, fileEntry As Map
        Dim J As JSONParser
        Dim files As List

        J.Initialize(h.GetString)
        files.Initialize
        Map1 = J.NextObject
        files = Map1.Get("files")
               
        If FilelisteExport.IsInitialized=False Then
            FilelisteExport.Initialize
            FilelisteExport.Clear
        End If
        For i = 0 To files.Size - 1
            fileEntry = files.Get(i)
            FilelisteExport.Add(fileEntry.Get("name") & ";" & fileEntry.Get("id"))
        Next
        CallSub2(evModule, evName & "_FileListResult", FilelisteExport)
    End If
End Sub


Das erstellen eines Ordners geht mittlerweile auch:
B4X:
Sub CreateFolder(FolderName As String, ParentFolder As String)
    Dim h As HttpJob
    Dim m As Map : m.Initialize
   
    Dim jg As JSONGenerator
    Dim data() As Byte
    m.Put("name",  FolderName)
    m.Put("mimeType", "application/vnd.google-apps.folder")
    If ParentFolder<>"" Then m.Put("parents",Array As String(ParentFolder))

    jg.Initialize(m)                        'Map zu JSON wandeln
    Log(jg.ToPrettyString(1))                'JSON Anzeigen, mit Zeilenumbruch
    data = (jg.ToString).GetBytes("UTF-8")    'in Datenstream wandeln
   
    h.Initialize("",Me)
    h.PostBytes("https://www.googleapis.com/drive/v3/files?UploadType=multipart",data)
    h.GetRequest.SetHeader("Authorization", "Bearer " & myAccessToken)
    h.GetRequest.SetContentType("application/json;charset=UTF-8")

    wait For (h) JobDone(h As HttpJob)
   
    If h.Success Then
        Log(h.GetString)
        Dim j As JSONParser
        Dim Map1 As Map
       
        J.Initialize(h.GetString)
        Map1 = J.NextObject
        CallSub2(evModule, evName & "_FolderCreated", Map1.Get("id"))
    End If
End Sub

jetzt "hackt" es beim File Upload. Da dies ein neues Problem ist, habe ich dazu auch einen neuen Theard aufgemacht:
https://www.b4x.com/android/forum/threads/probleme-beim-upload-zu-google-drive-http-multipart.80243/

Ich hoffe ihr könnt mir weiterhelfen.
 

DonManfred

Expert
Licensed User
Longtime User
Ich habe gestern ein wenig mit okHttp probiert aber ich bin nicht so recht weiter gekommen.
Ich habe dann begonnen etwas mit Java zu probieren.... Allerdings bin ich noch nicht so weit dass ich irgendwas brauchbares hätte :D

Ich habe einen GoogleClient der mit Google PlayService kommuniziert um daten aus Drive zu erhalten.
Der Client funktioniert nur bedingt... Der aufruf für OAuth klappt, auch die Authentifizierung durch den Benutzer. Allerdings die Rückmeldung an die App klappt nicht so recht.
Ruft man dann aber nochmal die Authentifizierung auf, dann bekomme ich CONNECTED gemeldet.

Ok, nun kann ich connecten aber nun benötige ich noch Diverse wraps für die Diversen Objekte.
DriveFile - kann Parents auflisten (aktueller Stand).
DriveFolder- kann children auflisten (aktueller Stand). Allerdings habe ich bisher nur leere Listen bekommen irgendwie.

Im Grunde müsste ich nun mit einem DriveFolder Objekt CreateFile aufrufen, wo ich dann eine Datei anlegen kann mit grundmetadaten. Zurückgeliefert wird dann ein DriveFile Objekt. Hier müsste ich nun hingehen, DriveFile.open aufrufen mit schreibrechten um dann zu dem DriveFile den Input und Outputstream zu erhalten.
Mit dem IS könnte man die Datei lesen, mit dem OS in die Datei schreiben/sie überschreiben.... Aktuell noch nicht vorhanden

Leider ist das alles noch nichts brauchbares. Ich weiss auch nicht wie weit ich hier machen möchte (ich benutze GoogleDrive nicht); mir fehlt die Motivation ;-)
 

mw71

Active Member
Licensed User
Longtime User
Hallo Manfred,

das dir die Motivation fehlt wenn du es selber (im Moment) nicht nutzt kann ich verstehen, aber ich denke der ein oder andere wird sich sicherlich über eine "saubere", solide Lösung freuen.

Ich bin auch noch am Testen, wenn es etwas neues gibt stelle ich es hier (oder bei Code Snipets) mal rein.

Grüße
 
Top