2015-05-11 24 views
8

Próbuję zaoferować bezpłatny okres próbny dla mojego rozszerzenia do Chrome i śledzę Chrome documentation, w jaki sposób można to osiągnąć."OAuth2 nie przyznano lub odwołano" podczas próby oceny bezpłatnej wersji próbnej w rozszerzeniu do Chrome

Kiedy moi mnóstwo rozszerzeń, choć skrypt tło loguje się następujący błąd w konsoli:

Nieograniczony runtime.lastError podczas biegu identity.getAuthToken: OAuth2 nie przyznano lub odwołane.

Konsola wskazuje na wywołanie chrome.identity.getAuthToken jako winowajcę. Oto odpowiedni kod w moim skrypcie tle:

var CWS_LICENSE_API_URL = 'https://www.googleapis.com/chromewebstore/v1.1/userlicenses/'; 

chrome.identity.getAuthToken({ 
    'interactive': false 
}, function(token) { 
    console.log('token', token); 

    var req = new XMLHttpRequest(); 
    req.open('GET', CWS_LICENSE_API_URL + chrome.runtime.id); 
    req.setRequestHeader('Authorization', 'Bearer ' + token); 
    req.onreadystatechange = function() { 
     if (req.readyState == 4) { 
      var license = JSON.parse(req.responseText); 
      console.log('license', license); 
     } 
    }; 
    req.send(); 
}); 

Mój manifest jest ustawiony jak tak (niektóre kawałki pominięty dla zwięzłość):

"manifest_version": 2, 
"key": "kkkkkkkkkkkkkkk", 

"background": { 
    "scripts": [ 
     "background.js" 
    ] 
}, 
"permissions": [ 
    "storage", 
    "identity", 
    "https://www.googleapis.com/" 
], 
"oauth2": { 
    "client_id": "cccccccccc.apps.googleusercontent.com", 
    "scopes": [ 
     "https://www.googleapis.com/auth/chromewebstore.readonly" 
    ] 
} 

oto co próbowałem lub potwierdzone:

  1. Identyfikator klienta jest zgodny z wartością w konsoli programisty Google, która została wygenerowana przy użyciu identyfikatora mojego rozszerzenia.
  2. Interfejs API Chrome Web Store jest włączony w konsoli programisty Google (jest to jedyny dostępny interfejs API).
  3. Klucz w manifeście jest zgodny z wartością wygenerowaną po umieszczeniu rozszerzenia w sklepie internetowym.
  4. Wywołanie getAuthToken z włączonym trybem interaktywnym powoduje ten sam błąd.
  5. Porównałem mój kod do this example i nic nie wyskoczyło na mnie, ponieważ jest zasadniczo inny (chociaż dodatkowa para oczu do potwierdzenia nie zaszkodzi).

W przypadku, jest to ważne, używam Chrome 42.0.2311.135 (64-bit) w systemie Mac OS X.

Wszelkie pomysły na temat tego, co jest przyczyną błędu i co trzeba zmienić, aby go odejść, abym mógł wyszukać token i licencję?

+0

Robię dokładnie to, co robisz i zastanawiałem się, co powinienem umieścić jako adres strony odsyłającej w konsoli Google Apis.Klucz Api dla sklepu internetowego Chrome Api – Kerndog73

+0

@ Kerndog73 - Nie pamiętam konieczności wpisywania strony odsyłającej w konsoli Google API. Włączyłem interfejs API Chrome Web Store i utworzyłem identyfikator klienta. Adres URL tego identyfikatora klienta odpowiada "identyfikator_klienta" w moim pliku 'manifest.json'. Możesz zadać nowe pytanie na SO i podać więcej szczegółów i zrzut ekranu. Link do tego tutaj, a ja to sprawdzę. –

+0

Nie, nie będę się tym martwić. Jest opcjonalny, ale bardzo polecany. To dla mnie wciąż opcjonalne. – Kerndog73

Odpowiedz

10

Kod mądry, jedyną zmianą jest konieczna, aby umożliwić tryb interaktywny:

chrome.identity.getAuthToken({ 
    'interactive': true 
}, function(token) { 
    ... 
}); 

Było też kilka problemów PEBCAK dzieje. Mianowicie:

  1. Może minąć kilka sekund, zanim pojawi się interaktywna strona auth. Wydaje się, że jest to problem z przepustowością. Może to być spowodowane tym, że documentation sugeruje wywoływanie żądania autoryzacji w jakiejś interakcji użytkownika, a nie po pierwszym załadowaniu rozszerzenia.
  2. Przerzucanie interaktywne między false i true i ponowne załadowanie rozszerzenia nie było wystarczającym testem funkcjonalności. Wynik getAuthToken jest buforowany. Kiedy cofam autoryzację, a następnie odświeżam lub nawet usuwam i ponownie dodaję moje rozszerzenie, ten sam token będzie nadal zwracany przez pewien czas. Ponowne uruchomienie Chrome z włączonym trybem interaktywnym doprowadziło mnie do tego rozwiązania.
+0

Dzięki za odpowiedź. Czy wiesz, jak mogę usunąć uprawnienia, które podałem * początkowo * do rozszerzenia? Teraz nawet jeśli przeinstalujesz rozszerzenie, nie pyta mnie o pozwolenie (w moim przypadku zarządzanie plikami na Dysku) i zwraca token dostępu. Chcę, aby rozszerzenia ponownie pytały mnie o pozwolenie po jego ponownym zainstalowaniu. Próbowałem również usunąć trojany token 'chrome.identity.removeCachedAuthToken ( {'token': token}, function() {})' ale wydaje się niezwiązany z uprawnieniami i nie pomógł. –

+1

@SergeyIvanov Dobre pytanie, ale prawdopodobnie lepiej jest zadać nowe pytanie na SO zamiast w komentarzu. Jeśli opublikujesz nowe pytanie, koniecznie link do niego tutaj! –

+0

Możesz znaleźć pytanie tutaj http://stackoverflow.com/q/30491789/2069858 –