Hello Dmitri, Please see my answers inline:
On Sun, Jul 10, 2011 at 1:39 AM, DP <[email protected]> wrote: > > First I redirect the user to the Google Calendar authorization page > (the one with "Allow/deny access"): > > > try { > > oauthParameters = new GoogleOAuthParameters(); > > oauthParameters.setOAuthConsumerKey("myapp.com"); > > oauthParameters.setScope(SCOPE_CALENDAR); > > oauthParameters.setOAuthCallback(REDIRECT_URL); > > > > privKey = getPrivateKey(); > > > > oauthHelper = > > new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey)); > > oauthHelper.getUnauthorizedRequestToken(oauthParameters); > > > > TPTApplication > > .getCurrentApplication() > > .getMainWindow() > > .open(new ExternalResource(oauthHelper > > .createUserAuthorizationUrl(oauthParameters)), > > "_top"); > > > > } catch (final OAuthException exception) { > > LOGGER.error("", exception); > > } > > When the user has allowed my application to access his/her Google > Calendar data, he is redirected to my application. > > In the querystring, there are oauth_verifier and oauth_token > parameters. > > From them, I get the token secret: > > > oauthHelper.getOAuthParametersFromCallback(oauthQueryString, > > oauthParameters); > > LOGGER.debug("Token secret: '{}'", > > oauthParameters.getOAuthTokenSecret()); > > > > Note that oauthHelper and oauthParameters are exactly the same Java > objects as in the first code snipped (i. e. I create them there and re- > use them, when the user returns to my page). > > At the end of the interactive part I have 3 pieces of information: > > 1) OAuth verifier > 2) Token > 3) Token secret > > Server part > > In the server part, I use them to get access to Google Calendar data: > > > > @Test > > public void testCalendar() { > > final HttpTransport httpTransport = new NetHttpTransport(); > > final JacksonFactory jsonFactory = new JacksonFactory(); > > > > try { > > PrivateKey privKey = getPrivateKey(); > > final OAuthRsaSha1Signer signer = new > OAuthRsaSha1Signer(privKey); > > > > > > GoogleOAuthParameters oauthParameters = new > GoogleOAuthParameters(); > > oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); > > > > GoogleOAuthHelper oauthHelper = new > GoogleOAuthHelper(signer); > > > > > > > > oauthParameters.setScope(" > http://www.google.com/calendar/feeds/"); > > > Please use "https://www.google.com/calendar/feeds" as scope. > oauthParameters.setOAuthVerifier("toy8IMW6sInKDTjPxfy5zMFD"); > > > > > oauthParameters.setOAuthToken("4/Oj-Q3isN3rz8mvJbgAkaIHGkL882"); > > > oauthParameters.setOAuthTokenSecret("xQ8-9M22ZSdITuaTFAhPpcoA"); > > > Are those hard-coded or retrieved from the OAuth dance? > > oauthHelper.getAccessToken(oauthParameters); > > > Are you executing this code every time? You should do it only once to retrieve the long-lived Access Token. > > > [...] > But when I run the test case second (third, fourth, n-th) time, I get > the exception > > > > com.google.gdata.client.authn.oauth.OAuthException: Error getting HTTP > response > > at > com.google.gdata.client.authn.oauth.OAuthHttpClient.getResponse(OAuth > > HttpClient.java:76) ~[gdata-core-1.0.jar:na] > > at > com.google.gdata.client.authn.oauth.OAuthHttpClient.getResponse(OAuth > > HttpClient.java:44) ~[gdata-core-1.0.jar:na] > > at > com.google.gdata.client.authn.oauth.OAuthHelper.getAccessToken(OAuthH > > elper.java:559) ~[gdata-core-1.0.jar:na] > > at com.myapp.test.serversidedoauth.TestServerSidedOAuth.testCa > > lendar(TestServerSidedOAuth.java:133) ~[test-classes/:na] > Can you check one code is executed on this line? Apparently this is what is throwing the exception. Thanks! Alain > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > ~[na:1.6. > > 0_23] > > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. > > java:39) ~[na:1.6.0_23] > > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces > > sorImpl.java:25) ~[na:1.6.0_23] > > at java.lang.reflect.Method.invoke(Method.java:597) > ~[na:1.6.0_23] > > at > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(Framework > > Method.java:44) [junit-4.8.2.jar:na] > > at > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCal > > lable.java:15) [junit-4.8.2.jar:na] > > at > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMe > > thod.java:41) [junit-4.8.2.jar:na] > > at > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMet > > hod.java:20) [junit-4.8.2.jar:na] > > at > org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4Cla > > ssRunner.java:79) [junit-4.8.2.jar:na] > > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRun > > ner.java:71) [junit-4.8.2.jar:na] > > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRun > > ner.java:49) [junit-4.8.2.jar:na] > > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) > [junit-4. > > 8.2.jar:na] > > at > org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) [juni > > t-4.8.2.jar:na] > > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) [ju > > nit-4.8.2.jar:na] > > at > org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) [juni > > t-4.8.2.jar:na] > > at > org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) [jun > > it-4.8.2.jar:na] > > at org.junit.runners.ParentRunner.run(ParentRunner.java:236) > [junit-4.8. > > 2.jar:na] > > at > org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet. > > java:62) [surefire-junit4-2.4.3.jar:2.4.3] > > at > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTes > > tSet(AbstractDirectoryTestSuite.java:140) [surefire-api-2.4.3.jar:2.4.3] > > at > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(Ab > > stractDirectoryTestSuite.java:127) [surefire-api-2.4.3.jar:2.4.3] > > at org.apache.maven.surefire.Surefire.run(Surefire.java:177) > [surefire-a > > pi-2.4.3.jar:2.4.3] > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > ~[na:1.6. > > 0_23] > > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. > > java:39) ~[na:1.6.0_23] > > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces > > sorImpl.java:25) ~[na:1.6.0_23] > > at java.lang.reflect.Method.invoke(Method.java:597) > ~[na:1.6.0_23] > > at > org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(Su > > refireBooter.java:345) [surefire-booter-2.4.3.jar:2.4.3] > > at > org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.j > > ava:1009) [surefire-booter-2.4.3.jar:2.4.3] > > Caused by: java.io.IOException: Server returned HTTP response code: 400 > for URL: > > > https://www.google.com/accounts/OAuthGetAccessToken?scope=http%3A%2F%2Fwww.goog > > le.com > %2Fcalendar%2Ffeeds%2F&oauth_nonce=5563771650945&oauth_signature_method=RS > > A-SHA1&oauth_consumer_key=myapp.com > &oauth_token=4%2FOj-Q3isN3rz8mvJbgAkaIHGkL882 > > > &oauth_verifier=toy8IMW6sInKDTjPxfy5zMFD&oauth_timestamp=1310285997&oauth_signat > > > ure=nvZ%2FLIxaE%2FKGHS1kWTpIlL9sfV5mvaN4%2B755h1wIbUMiXFylnKQMXTGqzSZNkFtWkQGgVf > > > tl9xCFaDAHxjPxksHytHdpCW%2BWj146UkQH0L2g8W57y97zI9DLArB82rBWF%2BEeyU%2Bminr5TpJH > > x%2BQMZ6pAx6sih5rIuTLskbi8mqc%3D > > at > sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLCon > > nection.java:1441) ~[na:1.6.0_23] > > at > sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Http > > sURLConnectionImpl.java:234) ~[na:1.6] > > at > com.google.gdata.client.authn.oauth.OAuthHttpClient.getResponse(OAuth > > HttpClient.java:66) ~[gdata-core-1.0.jar:na] > > ... 30 common frames omitted > > > > What I want to achieve is that the server-sided part runs not just > once, but as > many times as I want (until the user or I revoke access). > > What part of my code is wrong? > > Thanks in advance > > Dmitri > > > On Jul 6, 6:29 pm, Alain Vongsouvanh <[email protected]> wrote: > > Hello Dmitri, > > > > You are getting an OAuth 2.0 token for the Tasks API and are using the > same > > token to access the Calendar API using the OAuth 1.0 protocol. The error > is > > expected as those tokens are not compatible. > > > > If you want to use the OAuth 2.0 token from the Tasks API to access > Calendar > > data, you can do something like this: > > > > service.setHeader("Authorization", "OAuth " + > this.oauthAccessToken); > > > > Please, do not forget to ask the Calendar API scope when requesting the > > OAuth 2.0 token: > > > > String scope = " > https://www.googleapis.com/auth/taskshttps://www.google.com/calendar/feeds > "; > > > > However, you will have to handle the "token expired" exception and > refresh > > the token manually as the Google Data client library doesn't natively > > support OAuth 2.0. > > > > One last thing, please use SSL (https) over non-SSL (http) whenever > possible > > for accessing Google APIs. > > > > Best, > > Alain > > > > > > > > > > > > > > > > > > > > On Fri, Jul 1, 2011 at 1:46 PM, DP <[email protected]> wrote: > > > Hello! > > > > > Can the cause of the problem be that I attempt to access two different > > > Google services (Tasks and Calendar) with different scopes using ONE > > > access token? > > > > > TIA > > > > > Dmitri > > > > > On Jul 1, 5:47 pm, DP <[email protected]> wrote: > > > > Hello! > > > > > > I get the error > > > > > > com.google.gdata.util.AuthenticationException: Unknown authorization > > > > header > > > > at > > > > > > com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java: > > > > 600) ~[gdata-core-1.0.jar:na] > > > > at > > > > > > com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java: > > > > 563) ~[gdata-core-1.0.jar:na] > > > > at > > > > > > com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java: > > > > 552) ~[gdata-core-1.0.jar:na] > > > > at > > > > > > com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java: > > > > 530) ~[gdata-core-1.0.jar:na] > > > > at > > > > > > com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java: > > > > 535) ~[gdata-core-1.0.jar:na] > > > > > > when trying to access the Google Calendar data via their API. > > > > > > Here is what happens before that error. > > > > > > 1) I authenticate with Google: > > > > > > final AccessTokenResponse response = > > > > new GoogleAuthorizationCodeGrant(httpTransport, > > > > jsonFactory, > > > > clientId, clientSecret, authorizationCode, > > > > redirectUrl).execute(); > > > > > > final GoogleAccessProtectedResource accessProtectedResource = > > > > new GoogleAccessProtectedResource( > > > > response.accessToken, httpTransport, jsonFactory, > > > > clientId, clientSecret, > > > > response.refreshToken); > > > > > > LOGGER.debug("response.accessToken: {}", response.accessToken); > > > > > > this.oauthAccessToken = response.accessToken; > > > > > > ... > > > > > > 2) I read some data via the tasks API: > > > > > > this.service = > > > > new Tasks(httpTransport, accessProtectedResource, > > > > jsonFactory); > > > > this.service.setApplicationName(this.applicationName); > > > > > > This seems to work. > > > > > > 3) Then I try to read data from the Google Calendar API: > > > > final OAuthHmacSha1Signer signer = new > > > > OAuthHmacSha1Signer(); > > > > > > final GoogleOAuthParameters oauth = new > > > > GoogleOAuthParameters (); > > > > > > oauth.setOAuthConsumerKey("myapp.com"); > > > > oauth.setOAuthConsumerSecret(CLIENT_SECRET); // Client > > > > secret from "Google API access" page, "Client secret" entry > > > > oauth.setOAuthToken(this.oauthAccessToken); // Access > > > > token from step 1 > > > > oauth.setOAuthTokenSecret(aAuthorizationCode); > > > > // aAuthorizationCode is taken from the callback URL. > > > > // Forhttp:// > > > myapp.com/oauth2callback?code=4/uy8Arb4bhRPwWYSr3QwKPt9lIZkt > > > > // aAuthorizationCode is equal to "4/ > > > > uy8Arb4bhRPwWYSr3QwKPt9lIZkt" (without quotes) > > > > > > oauth.setScope(SCOPE_CALENDAR); // > > >https://www.google.com/calendar/feeds/ > > > > > > final CalendarService calendarService = > > > > new CalendarService(APPLICATION_NAME); > > > > > > calendarService > > > > .setOAuthCredentials(oauth, signer); > > > > > > LOGGER.debug("calendarService: {}", calendarService); > > > > > > final URL feedUrl = > > > > new URL( > > > > "http://www.google.com/calendar/feeds/ > > > > default/allcalendars/full"); > > > > final CalendarFeed resultFeed = > > > > calendarService.getFeed(feedUrl, > > > > CalendarFeed.class); > > > > > > At the last line (calendarService.getFeed...) the aforementioned > > > > exception occurs. > > > > > > I have following questions: > > > > > > 1) Is my call > > > > > > oauth.setOAuthConsumerKey > > > > > > correct? > > > > > > I. e. is the "consumer key" equal to "Product name" in the Google API > > > > console, or to "Client ID" field (value is something like > > > > 42912397129473.apps.googleusercontent.com) > > > > > > 2) Is the setOAuthTokenSecret correct? I. e. is it the code that I > > > > get, when Google redirects the user back to my app? > > > > > > 3) If questions 2 and 3 were answered with yes, what else can be the > > > > cause of my problem? > > > > > > Thanks > > > > > > Dmitri > > > > > > P. S.: Previously, I could access Google calendar with simple access > > > > (i. e. with Google user name and password). However, this is not an > > > > option now because users of my app will not want to give away their > > > > Google password. > > > > > > P. P. S.: You can earn StackOverflow reputation points by answering > > > > the question there: > > >http://stackoverflow.com/questions/6550143/google-calendar-api-and-oa. > .. > > > > > -- > > > You received this message because you are subscribed to the Google > > > Groups "Google Calendar Data API" group. > > > To post to this group, send email to > > > [email protected] > > > To unsubscribe from this group, send email to > > > [email protected] > > > For more options, visit this group at > > >http://code.google.com/apis/calendar/community/forum.html > > > > -- > > Alain Vongsouvanh > > -- > You received this message because you are subscribed to the Google > Groups "Google Calendar Data API" group. > To post to this group, send email to > [email protected] > To unsubscribe from this group, send email to > [email protected] > For more options, visit this group at > http://code.google.com/apis/calendar/community/forum.html > -- Alain Vongsouvanh -- You received this message because you are subscribed to the Google Groups "Google Calendar Data API" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://code.google.com/apis/calendar/community/forum.html
