Al ver que he escrito JOAuth, pensé que sería apropiado responder a esta pregunta en SO. No encontré la opción de hacer de esta pregunta una wiki de la comunidad. :(
Nota No estoy aquí para hablar de OAuth Authorization. Hay varios sitios dedicados para esto.
JOAuth viene con una característica maravillosa. Tiene un controlador que gestiona el OAuthServlet
redirección HTTP respuesta de . el proveedor de servicio la manera de configurar OAuthServlet
a su aplicación web, sólo tiene que declarar como <servlet>
en su web.xml
así:
<servlet>
<description>An OAuth Servlet Controller</description>
<display-name>OAuthServlet</display-name>
<servlet-name>OAuthServlet</servlet-name>
<servlet-class>com.neurologic.oauth.servlet.OAuthServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/oauth-config.xml</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
y su correlación de servlet:
<servlet-mapping>
<servlet-name>OAuthServlet</servlet-name>
<url-pattern>/oauth/*</url-pattern>
</servlet-mapping>
Ahora, que tiene una configuración de OAuth servlet (tener en cuenta que <load-on-startup>
no es necesario, pero me gustaría tener mi servlets inicializado antes de usarlo), vamos a hablar acerca de la configuración JOAuth.
El archivo de configuración predeterminado de JOAuth es /WEB-INF/oauth-config.xml
(por lo tanto, no tiene que ser <init-param>
en su declaración de servlet). El archivo de configuración se ve de la siguiente manera:
<?xml version="1.0" encoding="UTF-8"?>
<oauth-config>
<!-- Twitter OAuth Config -->
<oauth name="twitter" version="1">
<consumer key="TWITTER_KEY" secret="TWITTER_SECRET" />
<provider requestTokenUrl="https://api.twitter.com/oauth/request_token" authorizationUrl="https://api.twitter.com/oauth/authorize" accessTokenUrl="https://api.twitter.com/oauth/access_token" />
</oauth>
<!-- Facebook OAuth -->
<oauth name="facebook" version="2">
<consumer key="APP_ID" secret="APP_SECRET" />
<provider authorizationUrl="https://graph.facebook.com/oauth/authorize" accessTokenUrl="https://graph.facebook.com/oauth/access_token" />
</oauth>
<service path="/request_token_ready" class="com.neurologic.music4point0.oauth.TwitterOAuthService" oauth="twitter">
<success path="/start.htm" />
</service>
<service path="/oauth_redirect" class="com.neurologic.music4point0.oauth.FacebookOAuthService" oauth="facebook">
<success path="/start.htm" />
</service>
</oauth-config>
Se dará cuenta de que cada elemento tiene un atributo <oauth>
version
(es un atributo obligatorio que se necesita por el controlador para saber qué flujo de OAuth para su uso). Estos solo tienen 2 valores posibles (1
para OAuth1 y 2
para OAuth 2). Para OAuth 2, el elemento <consumer>
no tiene el atributo requestTokenUrl
como su versión 1 homóloga.
El servicio de OAuth es el responsable del manejo de OAuth. Cada OAuthService
es llamado por el controlador a través del método execute()
. Hay 2 tipos de OAuthService
:
com.neurologic.oauth.service.impl.OAuth1Service
.
com.neurologic.oauth.service.impl.OAuth2Service
.
Nota Para cada servicio, si está utilizando OAuth 2, usted debe tiene un servicio que se extiende OAuth2Service
. Lo mismo aplica para OAuth 1. Si no se hace eso, se genera una excepción.
Cada etiqueta <service>
necesidad tienen un atributo que name
partidos el atributo <oauth>
name
(mayúsculas y minúsculas).
Tanto OAuth1Service
y OAuth2Service
execute(HttpServletRequest, HttpServletResponse)
se han aplicado a mejor manejar el flujo del protocolo de autorización OAuth, pero puede anularla si no está contento con él.
Un ejemplo de la com.neurologic.music4point0.oauth.FacebookOAuthService
:
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import net.oauth.enums.GrantType;
import net.oauth.exception.OAuthException;
import net.oauth.parameters.OAuth2Parameters;
import com.neurologic.oauth.service.impl.OAuth2Service;
import com.neurologic.oauth.util.Globals;
/**
* @author The Elite Gentleman
* @since 05 December 2010
*
*/
public class FacebookOAuthService extends OAuth2Service {
private static final String REDIRECT_URL = "http://localhost:8080/Music4Point0/oauth/oauth_redirect";
/* (non-Javadoc)
* @see com.neurologic.oauth.service.impl.OAuth2Service#processReceivedAuthorization(javax.servlet.http.HttpServletRequest, java.lang.String, java.util.Map)
*/
@Override
protected String processReceivedAuthorization(HttpServletRequest request, String code, Map<String, String> additionalParameters) throws OAuthException {
// TODO Auto-generated method stub
OAuth2Parameters parameters = new OAuth2Parameters();
parameters.setCode(code);
parameters.setRedirectUri(REDIRECT_URL);
Map<String, String> responseMap = getConsumer().requestAcessToken(GrantType.AUTHORIZATION_CODE, parameters, null, (String[])null);
if (responseMap == null) {
//This usually should never been thrown, but we just do anyway....
throw new OAuthException("No OAuth response retrieved.");
}
if (responseMap.containsKey("error")) {
throwOAuthErrorException(responseMap);
}
if (responseMap.containsKey(OAuth2Parameters.ACCESS_TOKEN)) {
String accessToken = responseMap.remove(OAuth2Parameters.ACCESS_TOKEN);
request.getSession().setAttribute(Globals.SESSION_OAUTH2_ACCESS_TOKEN, accessToken);
processAdditionalReceivedAccessTokenParameters(request, responseMap);
}
return null;
}
/* (non-Javadoc)
* @see com.neurologic.oauth.service.impl.OAuth2Service#processAdditionalReceivedAccessTokenParameters(javax.servlet.http.HttpServletRequest, java.util.Map)
*/
@Override
protected void processAdditionalReceivedAccessTokenParameters(HttpServletRequest request, Map<String, String> additionalParameters) throws OAuthException {
// TODO Auto-generated method stub
}
}
Desde que Facebook sigue utilizando OAuth 2 proyectos 0 (cero), su token de acceso no hace una redirección HTTP 302, y por eso processReceivedAuthorization()
es devuelve un valor nulo. El método processReceivedAuthorization()
permite que el cliente procese la autorización recibida code
y espera una URL de autorización (es por eso que espera un tipo de devolución de String
). Si el método devuelve null
o una cadena vacía, nunca se producirá una redirección de URL.
Una vez que se ha completado el flujo oauth, se llama a la ruta en el elemento <success>
(a través de RequestDispatcher
), para mostrar que OAuth se ha completado correctamente.
Para acceder al token de acceso, (después de inicio de sesión correcto a través de OAuth), haga lo siguiente:
AccessToken accessToken = (AccessToken)request.getSession().getAttribute(Globals.SESSION_OAUTH1_ACCESS_TOKEN); //For OAuth 1 access token
String accessToken = (String)request.getSession().getAttribute(Globals.SESSION_OAUTH2_ACCESS_TOKEN); //For OAuth 2 access token.
espero que este pequeño ejemplo ayuda a aquellos que están interesados en hacer OAuth una experiencia que merezca la pena para su desarrollo.
Disculpe que no he encontrado la casilla community wiki
. Visita mi blog (que no tiene casi nada) cuando tengas tiempo.
Adieu :-)
PS Esta es una implementación de la TwitterOAuthService
:
import javax.servlet.http.HttpServletRequest;
import net.oauth.exception.OAuthException;
import net.oauth.signature.impl.OAuthHmacSha1Signature;
import net.oauth.token.AccessToken;
import net.oauth.token.AuthorizedToken;
import net.oauth.token.RequestToken;
import com.neurologic.oauth.service.impl.OAuth1Service;
/**
* @author The Elite Gentleman
* @since 05 December 2010
*
*/
public class TwitterOAuthService extends OAuth1Service {
public static final String REQUEST_TOKEN_SESSION = "TWITTER_REQUEST_TOKEN_SESSION";
/* (non-Javadoc)
* @see com.neurologic.oauth.service.impl.OAuth1Service#processReceivedAuthorizedToken(javax.servlet.http.HttpServletRequest, net.oauth.token.AuthorizedToken)
*/
@Override
protected AccessToken processReceivedAuthorizedToken(HttpServletRequest request, AuthorizedToken authorizedToken) throws OAuthException {
// TODO Auto-generated method stub
String requestTokenSecret = null;
RequestToken requestToken = (RequestToken) request.getSession().getAttribute(REQUEST_TOKEN_SESSION);
if (requestToken != null) {
requestTokenSecret = requestToken.getTokenSecret();
}
return getConsumer().requestAccessToken(null, authorizedToken, requestTokenSecret, new OAuthHmacSha1Signature());
}
}
Recursos adicionales
Revise periódicamente si hay nuevas actualizaciones (acaba de actualizar la biblioteca) y también, si es posible, brinde sus comentarios. –
hola soy bastante nuevo para servlets y servicios de tomcat. posteo una pregunta en http://stackoverflow.com/questions/5297730/java-tomcat-how-to-use-joauth-por favor, hágamelo saber si puede ayudar de alguna manera – ufk
@ufk, gracias por usar 'JOAuth '. He respondido a tu publicación en consecuencia. Háganme saber de otros problemas si surge. PD, ¿cómo se enteró de JOAuth? –