Имам проблем с GoogleAuthorizationCodeFlow (Java). Опитвам се да изградя връзка с Google Календар за моя уеб проект, използвайки „OAuth 2.0 на Google за приложения за уеб сървър“. Следователно можете да използвате Java API библиотеките на Google.
Използвам AuthorizationCallbackServlet на Google, за да получа токен за достъп и опресняване.
GoogleAuthorizationCodeFlow запазва създадените идентификационни данни с GoogleAuthorizationCodeFlow и техния JdoCredentialStore. Като реализация на JDO използвам DataNucleus.
static PersistenceManagerFactory pmf;
static{
Properties properties = new Properties();
properties.setProperty("javax.jdo.PersistenceManagerFactoryClass",
"org.datanucleus.api.jdo.JDOPersistenceManagerFactory");
properties.setProperty("javax.jdo.option.ConnectionDriverName","com.mysql.jdbc.Driver");
properties.setProperty("javax.jdo.option.ConnectionURL","jdbc:mysql://localhost:3306/rssparsetest");
properties.setProperty("javax.jdo.option.ConnectionUserName","root");
properties.setProperty("javax.jdo.option.ConnectionPassword","root");
pmf = JDOHelper.getPersistenceManagerFactory(properties);
}
public static CredentialStore JDO_CREDENTIAL_STORE = new JdoCredentialStore(pmf);
public static AuthorizationCodeFlow AUTHORIZATION_CODE_FLOW = getNewAuthorizationCodeFlow();
public static AuthorizationCodeFlow getNewAuthorizationCodeFlow(){
return new GoogleAuthorizationCodeFlow.Builder(Constants.HTTP_TRANSPORT, Constants.JSON_FACTORY,
Constants.CLIENT_ID, Constants.CLIENT_SECRET,
Collections.singleton(CalendarScopes.CALENDAR)).setCredentialStore(Constants.JDO_CREDENTIAL_STORE).setAccessType("offline")
.build();
}
Използване в Bean без състояние:
public List<CalendarListEntry> getCalendarList() {
Credential credential = null;
AuthorizationCodeFlow authCodeFlow = Constants.getNewAuthorizationCodeFlow();
try {
credential = authCodeFlow.loadCredential("USERID");
} catch (Exception e) {
//...
}
Всичко работи добре (мога да изброявам записите си в календара, идентификационните данни се запазват в моята база данни на MySQL) с изключение че идва време за справка на токена за достъп с токена за постоянно опресняване (какво прави GoogleAuthorizationCodeFlow).
Caused by: javax.jdo.JDODataStoreException: Duplicate entry 'USERID' for key 'PRIMARY'
NestedThrowables:
java.sql.BatchUpdateException: Duplicate entry 'USERID' for key 'PRIMARY'
at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:421)
at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:735)
at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:755)
at com.google.api.client.extensions.jdo.auth.oauth2.JdoCredentialStore.store(JdoCredentialStore.java:47)
За да обобщя, мога да
- Получаване и запазване на идентификационните данни с accessToken и refreshToken
- Списък на записи в календара (стига времето на маркера за достъп да не е изтекло)
Не мога да опресня своя маркер за достъп с GoogleAuthorizationCodeFlow, без да получа изключение „javax.jdo.JDODataStoreException: Дублиран запис „USERID“ за ключ „PRIMARY“.
какво правя грешно
Благодаря ви много за вашата помощ!