2017-10-12 10 views
12

मैं सफलतापूर्वक आदेश गूगल शीट पर लिखने के लिए एक स्प्रिंग बूट ServiceClass, निम्नलिखित बनाए जाने के बाद अनधिकृत Java Quistart Tutorial for Sheets APIGoogle शीट जावा एसडीके oAuth कुछ घंटे (वसंत बूट)

मेरे समस्या यह है कि प्राधिकरण का नवीकरण नहीं है, इसलिए के बाद है ब्राउज़र के माध्यम से पहला सफल प्रमाणीकरण, कुछ घंटों के बाद मुझे 401 अनधिकृत मिलता है। ब्राउज़र लॉगिन को फिर से जारी किए बिना मैं स्वचालित रूप से टोकन को नवीनीकृत कैसे कर सकता हूं?

कोड के नीचे, अग्रिम धन्यवाद

import com.google.api.client.auth.oauth2.Credential; 
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; 
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; 
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver.Builder; 
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; 
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.client.util.store.FileDataStoreFactory; 
import com.google.api.services.sheets.v4.Sheets; 
import com.google.api.services.sheets.v4.SheetsScopes; 
import com.google.api.services.sheets.v4.model.AppendValuesResponse; 
import com.google.api.services.sheets.v4.model.ValueRange; 

@Service 
public class GoogleSheetsServiceImpl implements GoogleSheetsService { 

    private static final Log LOGGER = LogFactory.getLog(GoogleSheetsServiceImpl.class); 

    /** Application name. */ 
    @Value("${google-sheets.application-name}") 
    private String applicationName; 

    /** Directory to store user credentials for this application. */ 
    private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), 
      ".credentials/sheets.googleapis.com-orders"); 

    /** Global instance of the {@link FileDataStoreFactory}. */ 
    private FileDataStoreFactory dataStoreFactory; 

    /** Global instance of the JSON factory. */ 
    private JsonFactory jsonFactory; 

    /** Global instance of the HTTP transport. */ 
    private HttpTransport httpTransport; 

    /** 
    * Global instance of the scopes required by this quickstart. 
    * 
    * If modifying these scopes, delete your previously saved credentials at 
    * ~/.credentials/sheets.googleapis.com-java-quickstart 
    */ 
    private List<String> scopes; 

    /** Sheet service. */ 
    private Sheets sheetsService; 

    public GoogleSheetsServiceImpl() throws Throwable { 
     // init 
     try { 
      this.jsonFactory = JacksonFactory.getDefaultInstance(); 
      this.scopes = Arrays.asList(SheetsScopes.SPREADSHEETS); 
      this.httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
      this.dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR); 
     } catch (Throwable t) { 
      LOGGER.error("Error on init Google Sheets Service: " + t.getMessage()); 
      throw t; 
     } 

     // get sheet service 
     Credential credential = this.authorize(); 
     this.sheetsService = new Sheets.Builder(this.httpTransport, this.jsonFactory, credential) 
       .setApplicationName(this.applicationName).build(); 
    } 

    public void appendValueRangeToGoogleSheet(String spreadsheetId, String range, ValueRange valueRange) 
      throws IOException { 

     // append line 
     Sheets.Spreadsheets.Values.Append request = sheetsService.spreadsheets().values() 
       .append(spreadsheetId, range, valueRange).setValueInputOption("RAW"); 
     AppendValuesResponse response = request.execute(); 
    } 

    /** 
    * Creates an authorized Credential object. 
    * 
    * @return an authorized Credential object. 
    * @throws IOException 
    */ 
    private Credential authorize() throws IOException { 
     // Load client secrets. 
     InputStream in = GoogleSheetsServiceImpl.class.getResourceAsStream("/google_sheets/client_secret.json"); 
     GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(this.jsonFactory, new InputStreamReader(in)); 

     // Build flow and trigger user authorization request. 
     GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(this.httpTransport, this.jsonFactory, 
       clientSecrets, this.scopes).setDataStoreFactory(this.dataStoreFactory).setAccessType("online").build(); 
     LocalServerReceiver.Builder localServerReceiverBuilder = new Builder(); 
     localServerReceiverBuilder.setHost("localhost"); 
     localServerReceiverBuilder.setPort(46228); 
     Credential credential = new AuthorizationCodeInstalledApp(flow, localServerReceiverBuilder.build()) 
       .authorize("user"); 
     LOGGER.info("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); 
     return credential; 
    } 

} 

संपादित करें:

पालन GoogleAuthorizationCodeFlow वस्तु के निर्माण को संशोधित हल:

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(this.httpTransport, this.jsonFactory, 
      clientSecrets, this.scopes).setDataStoreFactory(this.dataStoreFactory).setAccessType("offline") 
        .setApprovalPrompt("force") 
        .addRefreshListener(
          new DataStoreCredentialRefreshListener(credentialUserId, this.dataStoreFactory)) 
        .build(); 
+0

मुझे लगता है कि https://www.draw.io पर लोग एक ही मुद्दा हो सकता है (उपयोगकर्ता के रूप में अपने अनुभव के आधार पर) –

+0

मैं गलत का उपयोग कर रहा हूँ दृष्टिकोण? मैंने यह जांचने की कोशिश की कि एपी-की के साथ कैसे किया जाए लेकिन मुझे कोई उदाहरण नहीं मिला – user4330585

+0

मुझे जवाब नहीं पता। मैं इस प्रश्न पर अन्य लोगों से अधिक ध्यान देने के लिए एक बक्षीस शुरू करूंगा जो इसे जान सकते हैं –

उत्तर

2

ताज़ा टोकन और यह नाम की एक अवधारणा है ऐसा लगता है कि यह आपकी जरूरतों के अनुरूप है।

आप अच्छी तरह से इस सवाल में वर्णन पा सकते हैं: https://stackoverflow.com/a/7209263/4988996

संपादित करें: अपनी टिप्पणी के अनुसार मैंने पाया गूगल DataStoreCredentialRefreshListener

पहुंच सुरक्षित क्रेडेंशियल का उपयोग कर संसाधन है। लागू होने पर, रीफ्रेश टोकन का उपयोग करके समाप्त हो चुके एक्सेस टोकन स्वचालित रूप से रीफ्रेश किए जाते हैं। DataStoreCredentialRefreshListener का उपयोग करना सुनिश्चित करें और इसे Credential.Builder.addRefreshListener (CredentialRefreshListener) का उपयोग करके क्रेडेंशियल के लिए सेट करें।

चेकआउट: https://developers.google.com/api-client-library/java/google-oauth-java-client/oauth2

static void addDataStoreCredentialRefreshListener( Credential.Builder credentialBuilder, String userId, DataStoreFactory dataStoreFactory) throws IOException { credentialBuilder.addRefreshListener( new DataStoreCredentialRefreshListener(userId, dataStoreFactory)); }

+1

आपके उत्तर के लिए धन्यवाद, क्या आपको पता है कि Google शीट्स जावा एसडीके के साथ कोई उदाहरण तैयार है या नहीं? – user4330585

+0

आपकी टिप्पणी के अनुसार उत्तर संपादित किया गया। एक नज़र देख लो। –

+0

@ user4330585 क्या आपने इस समाधान की कोशिश की है? कोई प्रतिपादन? बक्षीस आज –