2012-09-20 14 views
9

Drive API'sini biraz öğrenmek için DriveCommandLine uygulamasıyla uğraşıyorum. Masaüstü uygulamamın Google Drive ile kimlik doğrulaması yapmanın kullanıcı tarafından tarayıcıdan bir kimlik kodu kopyalama/yapıştırma ihtiyacı olmadan mümkün olup olmadığını merak ediyorum. Ancak, yalnızca bir kodun tarayıcıdan uygulamaya geri döndürülmesi yeterlidir? Bunu Dropbox API'sı ve Google Dokümanlar Listesi API'sı ile gerçekleştirebiliyorum, ancak bunu Google Drive API'sı ile nasıl çalıştıracağımızı anlayamıyorum.Kullanıcının kimlik doğrulama kodunu kopyalayıp yapıştırması gerekmeden Google Drive nasıl doğrulanır?

Teşekkürler.

Google Drive API - DriveCommandLine örnek uygulaması (biraz değiştirilmiş):

public class DriveCommandLine { 

    private static String CLIENT_ID = APPCONSTANTS.Google.CONSUMER_KEY; 
    private static String CLIENT_SECRET = APPCONSTANTS.Google.CONSUMER_SECRET; 

    private static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"; 

    public static void main(String[] args) throws IOException, URISyntaxException { 
    HttpTransport httpTransport = new NetHttpTransport(); 
    JsonFactory jsonFactory = new JacksonFactory(); 

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
     httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE)) 
     .setAccessType("offline") 
     .setApprovalPrompt("force").build(); 

    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 
    System.out.println("Enter authorization code:"); 
    Desktop.getDesktop().browse(new URI(url)); 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String code = br.readLine(); 

    GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 
    GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response); 

    //Create a new authorized API client 
    Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).build(); 
} 

Google Dokümanlar Listesi API:

public void authenticate(){ 
      GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
      oauthParameters.setOAuthConsumerKey(APPCONSTANTS.Google.CONSUMER_KEY); 

      OAuthSigner signer; 
      if (APPCONSTANTS.Google.USE_RSA_SIGNING) { 
        signer = new OAuthRsaSha1Signer(APPCONSTANTS.Google.CONSUMER_SECRET); 
      } else { 
       oauthParameters.setOAuthConsumerSecret(APPCONSTANTS.Google.CONSUMER_SECRET); 
       signer = new OAuthHmacSha1Signer(); 
      } 

      GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer); 

      oauthParameters.setScope(APPCONSTANTS.Google.SCOPES); 

      oauthHelper.getUnauthorizedRequestToken(oauthParameters); 

      String requestUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); 

      Desktop desktop = Desktop.getDesktop(); 
      URI url = new URI(requestUrl); 
      desktop.browse(url); 

      String token = oauthHelper.getAccessToken(oauthParameters); 
    } 
+0

Bu seçeneklerin her biri için "redirect_uri" değerlerini kullanıyor musunuz? Aynı akışları kullanıyor musunuz? –

+0

Google Dokümanlar Listesi API'sı ile kimlik doğrulamasını yapmak için kodumu ekledim. – PseudoPsyche

cevap

6

hat örnekleri basitlik için yazılan komut, mutlaka en iyi kullanıcı deneyimi . Bu durumda, yerel uygulamalar olarak çalışıyorlar ve OAuth 2.0 için yüklü uygulama akışını kullanıyorlar. Bu akış, redirect_uri'nin localhost'a yönlendirebileceği bir moda sahiptir, ancak yönlendirmeyi almak için geçici bir web sunucusunun başlatılmasını gerektirir. Örneği karmaşıklaştırmak yerine, kodu kopyalayıp yapıştırmayı gerektiren OOB modunu kullanır.

Bir masaüstü uygulaması oluşturuyorsanız, daha iyi bir UX olduğu için localhost'a yönlendirme rotasını sürdürmeyi öneririm.

Daha fazla bilgi için https://developers.google.com/accounts/docs/OAuth2InstalledApp adresine bakın.

+0

Teşekkürler! Tam olarak aradığım şey bu! – PseudoPsyche

+0

Tamam, ancak yeni Yetkilendirmeyi çağırmadan depolanan yenileme simgesini kullanarak yeni erişim belirtecini nasıl edinebilirim? Java'da belirtilmemişti. – Aerox

0

redirect_uri öğenizi localhost sayfanıza veya proje sayfanıza değiştirin. Sağlanan bağlantıdaki istek kodunuzu gönderecektir. İstek URL'sinde code = "yourauthcode" olacaktır. Örnek: https://yourwebsite.com/yourpage.htm?code= "yourauthcode"

6

Adım 1: çevrimdışı erişim türünü kullanarak URL Oluştur

flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE)) 
.setAccessType("offline") 
.setApprovalPrompt("auto").build(); 
String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 

Adım 2: kimlik Mağaza accessToken ve refreshToken

GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 
      GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport) 
       .setJsonFactory(jsonFactory) 
       .setClientSecrets(CLIENT_ID, CLIENT_SECRET) 
       .build() 
       .setFromTokenResponse(response); 
String accessToken = credential.getAccessToken(); 
String refreshToken = credential.getRefreshToken(); 

Adım 3: Yeniden kodlarının da gerekli

GoogleCredential credential1 = new GoogleCredential.Builder().setJsonFactory(jsonFactory) 
.setTransport(httpTransport).setClientSecrets(CLIENT_ID, CLIENT_SECRET).build(); 
credential1.setAccessToken(accessToken); 
credential1.setRefreshToken(refreshToken); 
Drive service = new Drive.Builder(httpTransport, jsonFactory, credential1).build(); 

Adım 4: Under Hataların üstesinden gelmek ve belirteçleri yenilemek için OAuth durma

+1

'code''u nereden alıyoruz (2. adımda' flow.newTokenRequest (code) 'da olduğu gibi)? – michaelsnowden

İlgili konular