Я работаю с ColdFusion 9.0.1 и последней (на текущий момент) стабильной сборкой библиотеки twitter4j - twitter4j-core-2.2.4. Я пытаюсь создать функциональность, которая позволяет пользователям входить или регистрироваться на нашем сайте, используя свои учетные записи в Twitter.
Мне удалось создать часть авторизации: пользователь нажимает на ссылку на нашем сайте, и система перенаправляет его на страницу Twitter. На этой странице он может «Авторизовать» наше приложение. После этого система перенаправляет его обратно с помощью callBackURL.
Но у меня проблема со следующим шагом. Когда я пытаюсь установитьOAuthAccessToken и для этого пытаюсь создать экземпляр объекта AccessToken с помощью следующей части кода:
accessToken = createObject( 'java', 'twitter4j.auth.AccessToken' ).init( 'myStoredRequestToken', 'myStoredRequestTokenSecret' );
Но у меня возникла ошибка:
Исключительная ситуация при создании экземпляра объекта Java. Класс
не должен быть интерфейсом или абстрактным классом. Ошибка: ''.
Есть идеи?
Обновление:
Начальная часть трассировки стека:
'coldfusion.runtime.java.JavaObjectInstantiationException: исключение экземпляра объекта. в coldfusion.runtime.java.JavaProxy.CreateObject (JavaProxy.java:171) в coldfusion.runtime.java.JavaProxy.invoke (JavaProxy.java:80) в coldfusion.runtime.CfJspPage._invoke (CfJspPage.java:2360) cftwitter2ecfc2084917956 $ funcGETUSERCREDENTIALS.runFunction (C: \ inetpub \ wwwroot_test \ twPlayGrnd_com \ twitter.cfc: 36) в coldfusion.runtime.UDFMethod.invoke (UDFMethod. : 368) at coldfusion.filter.FunctionAccessFilter.invoke (FunctionAccessFilter.java:55) в ...
... отсюда, не уверен, что это важно ...
последняя часть
cfapplication2ecfc665259542 $ funcONREQUEST.runFunction (C: \ inetpub \ wwwroot_test \ twPlayGrnd \ application.cfc: 55) ... еще 55 причин: java.lang.IllegalArgumentException: неверный формат маркера доступа * 10 *. на twitter4j.auth.AccessToken. (AccessToken.java:50) ... еще 60 '
Я видел сообщение о неправильном формате, но на основании документации в http://twitter4j.org должно быть принято два аргумента (строки с ключами). Я не прав?
Обновление 2
* просто выясните это - мне жаль, что я запутал вас в своем первом посте и примере ... конечно, я использовал myStoredRequestToken, myStoredRequestTokenSecret, а не ключ / секретный ключ пользователя *
* есть соответствующие части кода, которые я использую для этой функциональности *
application.cfc (функция "onApplicationStart", создание компонентов при запуске приложения)
<cffunction name="onApplicationStart" access="public" returntype="boolean" output="false">
...
<cfset application.com.twitterInstance = server.javaloader.create("twitter4j.TwitterFactory").getInstance() />
<cfset application.com.twitter = createObject("component","_com.twitter").init() /> *<!--- cfc component which will be listed below --->*
...
</cffunction>
twitter.cfc (соответствующий компонент холодного синтеза)
<cfcomponent displayname="twitter" output="false">
<cffunction name="init" access="public" output="false">
<cfreturn this>
</cffunction>
<cffunction name="authorizeTwitter" access="public" output="false">
<cfargument name="callBackURL" type="string" required="false" default="#request.twtCallBackURL#" />
<cfset var requestToken = "" />
<cfset application.com.twitterInstance.setOAuthConsumer(request.twtConsumerKey,request.twtConsumerSecret) />
<cfset requestToken = application.com.twitterInstance.getOAuthRequestToken(arguments.callBackURL) />
<cflock scope="session" type="exclusive" timeout="10">
<cfset session.oAuthRequestToken = requestToken.getToken()>
<cfset session.oAuthRequestTokenSecret = requestToken.getTokenSecret()>
</cflock>
<cflocation url="#vLocal.requestToken.getAuthorizationURL()#" addtoken="No" />
</cffunction>
<cffunction name="getUserCredentials" access="public" output="true">
<cfset var vLocal = {} />
<cfset vLocal.accessToken = "" />
<cfset vLocal.userData = "" />
<cfset vLocal.requestToken = "" />
<cfset vLocal.accessToken = server.javaloader.create("twitter4j.auth.AccessToken").init(session.oAuthRequestToken,session.oAuthRequestTokenSecret)>
<cfset application.com.twitterInstance.setOAuthAccessToken(vLocal.accessToken) />
<cfset vLocal.userData = application.com.twitterInstance.verifyCredentials() />
<cfdump var="#vLocal.userData#" label="User Credentials">
</cffunction>
Первая функция для первого шага - запросить твиттер для страницы авторизации (где пользователь может авторизовать или отклонить приложение). URL обратного вызова запускает страницу, которая вызывает вторую функцию, и у меня проблема только на этом этапе (строка для генерации accessToken).
У меня тот же результат, если я использую функцию createObject вместо javaloader.
* Итак, мой главный вопрос остается прежним - получить пользователям уникальный токен доступа? Пожалуйста, укажите мне, что я делаю не так? Что такое правильный формат для генерации accessToken уникального пользователя? Должен ли я разместить параметр oauth_verifier там? если да, то как? *