ThaDon
ThaDon

Reputation: 8068

401 - Token invalid when requesting video feed

I'm at a loss for what's wrong. I'm always getting com.google.gdata.client.GoogleService$SessionExpiredException: Token invalid Token invalid when making API requests.

I have the following flow:

  1. link user account
  2. use credentials to get video upload entries

The code I use to link the user (get permission for my application) uses the JdoDataStoreFactory to persist user tokens and refresh info between API calls.

I used the following scopes when I ask the user to authorize my apps:

https://www.googleapis.com/auth/youtube.upload https://www.googleapis.com/auth/youtube.readonly

Using GoogleAuthorizationCodeFlow I do a loadCredentials passing in the userId from my application that I used when requesting their auth token. I then feed those credentials to YouTubeService's getFeed method, requesting the url for video feeds: http://gdata.youtube.com/feeds/api/users/default/uploads

It looks like this:

service.setOAuth2Credentials(credentials)
videoFeed = service.getFeed(new URL(USER_FEED_PREFIX + DEFAULT_USER
        + UPLOADS_FEED_SUFFIX), VideoFeed.class)

After this executes, I always get the stacktrace:

com.google.gdata.client.GoogleService$SessionExpiredException: Token invalid Token invalid

Token invalid

Error 401

at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:570) at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:560) at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:538) at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:536) at com.google.gdata.client.Service.getFeed(Service.java:1135) at com.google.gdata.client.Service.getFeed(Service.java:998) at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:645) at com.google.gdata.client.Service.getFeed(Service.java:1017)

The way I'm initiating my request to my service is via curl, my command looks like this:

curl http://localhost:8080/user/someUserId/content

Using Wireshark I see the following in my request:

GET /feeds/api/users/default/uploads HTTP/1.1                                                                                   
Authorization: Bearer <the_auth_token_for_the_user>
User-Agent: MyApp YouTube-Java/1.0 GData-Java/null(gzip)
X-GData-Client: MyApp
Accept-Encoding: gzip
GData-Version: 2.0
Cache-Control: no-cache
Pragma: no-cache
Host: gdata.youtube.com
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

I'm stuck.

Upvotes: 0

Views: 964

Answers (1)

ThaDon
ThaDon

Reputation: 8068

Ok, I figured this out. I was trying to query the user's uploaded videos, and apparently for an app to do that it has to be authorized for the https://www.googleapis.com/auth/youtube scope, not the scopes I had configured

Upvotes: 1

Related Questions