2010-12-07 13 views
5

He visto demasiadas preguntas aquí (SO) preguntando acerca de OAuth y cómo conectarme a Facebook Graph API o Twitter API usando el protocolo OAuth.JOAuth, una biblioteca basada en java OAuth 1 (final) y OAuth 2 (borrador 10). ¿Como lo uso?

Descubrí JOAuth (de Google Code) y me preguntaba cómo puedo usarlo? ¿Qué otras características ofrece JOAuth y le va bien con otras bibliotecas java oauth?

+0

Revise periódicamente si hay nuevas actualizaciones (acaba de actualizar la biblioteca) y también, si es posible, brinde sus comentarios. –

+0

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

+0

@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? –

Respuesta

13

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 namepartidos el atributo <oauth>name (mayúsculas y minúsculas).

Tanto OAuth1Service y OAuth2Serviceexecute(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