2013-02-13 60 views
1

我想使用新的Calendar API v3列出日曆活動。我已閱讀該文章(Calendar API v3, 2-legged OAuth & Java),並以同樣的方式進行了身份驗證。請參閱我廠:列出針對不同用戶的Google日曆活動

import java.io.IOException; 

import com.gene.herder.google.GoogleApiSettings; 
import com.google.api.client.auth.oauth.OAuthHmacSigner; 
import com.google.api.client.auth.oauth.OAuthParameters; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.calendar.Calendar; 
import com.google.api.services.calendar.Calendar.Builder; 
import com.google.api.services.calendar.CalendarRequest; 
import com.google.api.services.calendar.CalendarRequestInitializer; 

public final class CalendarApiFactory { 

    private GoogleApiSettings settings; 

    public CalendarApi createCalendarApi() { 
     Calendar calendar = createBuilder(settings).build(); 

     CalendarApi calendarApi = new CalendarApi(); 
     calendarApi.setCalendar(calendar); 
     return calendarApi; 
    } 

    private Builder createBuilder(GoogleApiSettings settings) { 
     HttpTransport transport = new NetHttpTransport(); 
     JacksonFactory jsonFactory = new JacksonFactory(); 

     OAuthParameters oauthParameters = createOAuthParameters(settings); 

     Builder builder = new Builder(transport, jsonFactory, oauthParameters); 
     builder.setApplicationName("MY-COMPANY-MY-APP/1.0"); 
     builder.setCalendarRequestInitializer(new SettingsCalendarRequestInitializer(settings)); 
     return builder; 
    } 

    private OAuthParameters createOAuthParameters(GoogleApiSettings settings) { 
     OAuthParameters oauthParameters = new OAuthParameters(); 
     oauthParameters.version = "1"; 
     oauthParameters.consumerKey = settings.getClientKey(); 
     oauthParameters.signer = createSigner(settings); 
     return oauthParameters; 
    } 

    private OAuthHmacSigner createSigner(GoogleApiSettings settings) { 
     OAuthHmacSigner signer = new OAuthHmacSigner(); 
     signer.clientSharedSecret = settings.getClientSecret(); 
     return signer; 
    } 

    public void setSettings(GoogleApiSettings settings) { 
     this.settings = settings; 
    } 
} 

class SettingsCalendarRequestInitializer extends CalendarRequestInitializer { 

    private GoogleApiSettings settings; 

    public SettingsCalendarRequestInitializer(GoogleApiSettings settings) { 
     this.settings = settings; 
    } 

    @Override 
    protected void initializeCalendarRequest(CalendarRequest<?> request) throws IOException { 
     request.setKey(settings.getApiKey()); 
    } 
} 

之後,我以這種方式實現的CalendarApi

import java.io.IOException; 

import com.google.api.client.util.ArrayMap; 
import com.google.api.services.calendar.Calendar; 
import com.google.api.services.calendar.Calendar.Events.Insert; 
import com.google.api.services.calendar.Calendar.Events.List; 
import com.google.api.services.calendar.model.Event; 
import com.google.api.services.calendar.model.Events; 

public class CalendarApi { 

    private Calendar calendar; 

    public Events listEvents(String calendarId) throws IOException { 
     // Add the xoauth_requestor_id query parameter to let the API know 
     // on behalf of which user the request is being made. 
     ArrayMap<String, Object> customKeys = new ArrayMap<String, Object>(); 
     customKeys.add("xoauth_requestor_id", calendarId); 

     List events = calendar.events().list("primary"); 
     events.setUnknownKeys(customKeys); 
     return events.execute(); 
    } 

    public void setCalendar(Calendar calendar) { 
     this.calendar = calendar; 
    } 
} 

我的域的配置是這樣的:
高級工具=>管理第三方OAuth客戶端訪問 enter image description here

和我的控制檯API看起來像這樣:

enter image description here

現在,如果我調用我listEvents法「[email protected]」參數一切正常確定。我可以看到指定日曆中的所有事件。

但是,當我通過任何其他域用戶時,我總是收到「無效憑證」異常。堆棧跟蹤:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized 
{ 
    "code" : 401, 
    "errors" : [ { 
    "domain" : "global", 
    "location" : "Authorization", 
    "locationType" : "header", 
    "message" : "Invalid Credentials", 
    "reason" : "authError" 
    } ], 
    "message" : "Invalid Credentials" 
} 
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:143) ~[google-api-client-1.13.2-beta.jar:1.13.2-beta] 
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:115) ~[google-api-client-1.13.2-beta.jar:1.13.2-beta] 
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) ~[google-api-client-1.13.2-beta.jar:1.13.2-beta] 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:309) ~[google-api-client-1.13.2-beta.jar:1.13.2-beta] 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1090) ~[google-http-client-1.13.1-beta.jar:1.13.1-beta] 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:407) ~[google-api-client-1.13.2-beta.jar:1.13.2-beta] 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:340) ~[google-api-client-1.13.2-beta.jar:1.13.2-beta] 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:458) ~[google-api-client-1.13.2-beta.jar:1.13.2-beta] 
    at com.gene.herder.google.calendar.CalendarApi.listEvents(CalendarApi.java:31) ~[CalendarApi.class:na] 

我的Maven依賴關係是這樣的:

<!-- Google API --> 
<dependency> 
    <groupId>com.google.apis</groupId> 
    <artifactId>google-api-services-calendar</artifactId> 
    <version>v3-rev22-1.13.2-beta</version> 
</dependency> 
<dependency> 
    <groupId>com.google.http-client</groupId> 
    <artifactId>google-http-client-jackson2</artifactId> 
    <version>1.13.1-beta</version> 
</dependency> 
<dependency> 
    <groupId>com.google.oauth-client</groupId> 
    <artifactId>google-oauth-client-jetty</artifactId> 
    <version>1.13.1-beta</version> 
</dependency> 

爲什麼它不工作?我認爲我可以爲任何我想要的用戶使用該API。我犯了什麼錯誤?

回答

2

我們必須在CPanel中啓用雙腿OAuth訪問控制選項。使用此選項API工作正常。
您可以在以下位置找到此選項:
高級工具=>管理OAuth域密鑰=>雙腿OAuth訪問控制