看到我已经写了JOAuth,我认为在SO上回答这个问题是适当的。 我没有找到使这个问题成为社区Wiki的选项。:(
请注意, 我不是在这里讨论OAuth授权。有许多专用于此的站点。
JOAuth具有出色的功能。它具有一个控制器
OAuthServlet,用于管理来自服务提供商的HTTP重定向响应。配置方式
OAuthServlet到你的web应用程序,只需声明它作为一个
<servlet>在你
web.xml像这样:
<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>
和您的servlet映射:
<servlet-mapping> <servlet-name>OAuthServlet</servlet-name> <url-pattern>/oauthpublic class FacebookOAuthService extends OAuth2Service { private static final String REDIRECT_URL = "http://localhost:8080/Music4Point0/oauth/oauth_redirect"; @Override protected String processReceivedAuthorization(HttpServletRequest request, String pre, Map<String, String> additionalParameters) throws OAuthException { // TODO Auto-generated method stub OAuth2Parameters parameters = new OAuth2Parameters(); parameters.setCode(pre); 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; } @Override protected void processAdditionalReceivedAccessTokenParameters(HttpServletRequest request, Map<String, String> additionalParameters) throws OAuthException { // TODO Auto-generated method stub }}
由于Facebook仍使用OAuth 2草案0(零),因此其访问令牌不会执行HTTP
302重定向,这就是为什么
processReceivedAuthorization()它返回null
的原因。该
processReceivedAuthorization()方法允许客户端处理收到的授权,
pre并 期望
授权URL(这就是为什么期望返回类型为
String)的原因。如果该方法返回a
null或空字符串,则永远不会发生url重定向。
oauth流完成后,将
<success>调用元素中的路径(通过
RequestDispatcher),以表明OAuth已成功完成。
要访问访问令牌(在通过OAuth成功登录后),请执行以下 *** 作:
AccessToken accessToken = (AccessToken)request.getSession().getAttribute(Globals.SESSION_OAUTH1_ACCESS_TOKEN); //For OAuth 1 access tokenString accessToken = (String)request.getSession().getAttribute(Globals.SESSION_OAUTH2_ACCESS_TOKEN); //For OAuth 2 access token.
我希望这个小例子可以帮助那些热衷于使OAuth成为其开发值得经历的人。
抱歉,我找不到该
community wiki复选框。有空时访问我的博客(几乎没有内容)。
阿迪厄:-)
PS 这是实现
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;public class TwitterOAuthService extends OAuth1Service { public static final String REQUEST_TOKEN_SESSION = "TWITTER_REQUEST_TOKEN_SESSION"; @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()); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)