Voyant que j'ai écrit JOAuth, j'ai pensé qu'il serait approprié de répondre à cette question sur SO. Je n'ai pas trouvé l'option de faire de cette question un wiki communautaire. :(
Remarque Je ne suis pas ici pour discuter de OAuth Authorization. Il existe plusieurs sites dédiés à cet effet.
JOAuth est livré avec une caractéristique merveilleuse. Il a un contrôleur OAuthServlet
qui gère votre HTTP Redirect réponse de . le fournisseur de services la façon de configurer OAuthServlet
à votre application web, déclarer simplement comme <servlet>
dans votre web.xml
comme ceci:
<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>
Et votre mappage de servlet:
<servlet-mapping>
<servlet-name>OAuthServlet</servlet-name>
<url-pattern>/oauth/*</url-pattern>
</servlet-mapping>
Maintenant que vous avez une configuration de servlet OAuth (garder à l'esprit que <load-on-startup>
est pas nécessaire, mais je voudrais avoir mon servlets initialisé avant de l'utiliser), nous allons parler de la configuration JOAuth.
Le fichier de configuration JOAuth par défaut est /WEB-INF/oauth-config.xml
(il n'est donc pas nécessaire d'indiquer <init-param>
dans votre déclaration de servlet). Le fichier de configuration se présente comme suit:
<?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>
Vous remarquerez que chaque élément a un attribut <oauth>
version
(il est un attribut obligatoire qui est nécessaire par le contrôleur pour savoir quels flux OAuth à utiliser). Ces seulement ont 2 valeurs possibles (1
pour OAuth1 et 2
pour OAuth 2). Pour OAuth 2, l'élément <consumer>
n'a pas l'attribut requestTokenUrl
comme son homologue version 1.
Le service OAuth est responsable de la gestion OAuth. Chaque OAuthService
est appelée par le contrôleur via la méthode execute()
. Il existe 2 types de OAuthService
:
com.neurologic.oauth.service.impl.OAuth1Service
.
com.neurologic.oauth.service.impl.OAuth2Service
.
Remarque Pour chaque service, si vous utilisez OAuth 2, vous devez avoir un service qui étendOAuth2Service
. La même chose s'applique à OAuth 1. Si vous ne le faites pas, une exception est levée.
Chaque balise <service>
doit ont un attribut name
que matchs l'<oauth>
name
attribut (sensible à la casse).
Les deux OAuth1Service
et OAuth2Service
execute(HttpServletRequest, HttpServletResponse)
ont été mis en œuvre pour mieux gérer le flux du protocole d'autorisation OAuth, mais vous pouvez l'emporter si vous n'êtes pas heureux avec elle.
Un exemple de 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
}
}
Depuis que Facebook utilise encore OAuth 2 projet 0 (zéro), leur jeton d'accès ne fait pas une redirection HTTP 302, et qui est la raison pour laquelle processReceivedAuthorization()
est retourne une valeur nulle. La méthode processReceivedAuthorization()
permet au client de traiter l'autorisation reçue code
et s'attend à une URL d'autorisation (c'est pourquoi il attend un type de retour String
). Si la méthode renvoie null
ou une chaîne vide, une redirection d'URL ne se produit jamais.
Une fois que le flux OAuth a terminé, le chemin dans l'élément <success>
est alors appelé (par un RequestDispatcher
), pour montrer que OAuth est terminé avec succès.
Pour accéder au jeton d'accès, (après ouverture de session réussie via OAuth), procédez comme suit:
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.
J'espère que ce petit exemple aide ceux qui sont désireux de OAuth une expérience worthwile pour leur développement. Désolé, je n'ai pas trouvé la case community wiki
. Visitez mon blog (qui n'a presque rien sur lui) quand vous avez le temps.
:-) Adieu
PS Ceci est une mise en œuvre du 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());
}
}
Ressources supplémentaires
Veuillez vérifier périodiquement les nouvelles mises à jour (juste mis à jour la bibliothèque) et, si possible, veuillez nous faire part de vos commentaires. –
Salut, je suis assez nouveau pour les servlets et les services Tomcat. Je poste une question à http://stackoverflow.com/questions/5297730/java-tomcat-how-to-use-joauth-properly s'il vous plaît laissez-moi savoir si vous pouvez aider de quelque manière que ce soit – ufk
@ufk, merci d'utiliser 'JOAuth '. J'ai répondu à votre message en conséquence. Faites-moi savoir d'autres questions si cela se produit. PS, comment avez-vous entendu parler de JOAuth? –