如何解决JOAuth,一个基于Java的OAuth 1最终版本和OAuth 2草案10库如何使用?
看到我已经写了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>/oauth/*</url-pattern>
</servlet-mapping>
现在,您已经设置了OAuth servlet(请记住,这<load-on-
startup>
不是必需的,但是我希望在使用它之前初始化servlet),让我们来讨论配置JOAuth。
缺省的JOAuth配置文件是/WEB-INF/oauth-config.xml
(因此不必<init-
param>
在servlet声明中)。配置文件如下所示:
<?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>
您会注意到,每个<oauth>
元素都有一个version
属性(这是控制器知道要使用的oauth流所必需的属性)。这些
具有2个可能的值(1
用于OAuth1和2
OAuth 2)。对于OAuth
2,该<consumer>
元素不具有requestTokenUrl
其版本1对应的属性。
OAuth服务是负责OAuth处理的一项服务。每个OAuthService
都由控制器通过execute()
方法调用。有2种类型OAuthService
:
-
com.neurologic.oauth.service.impl.OAuth1Service
。 -
com.neurologic.oauth.service.impl.OAuth2Service
。
对于每种服务,如果您使用的是OAuth 2,则 具有可 扩展 的服务OAuth2Service
。OAuth
1也是如此。否则,将引发异常。
每个<service>
标签 有一个name
该属性 的<oauth>
name
属性(区分大小写)。
双方OAuth1Service
并OAuth2Service
execute(HttpServletRequest,
HttpServletResponse)
已落实到 最好的 处理OAuth认证协议的流程,但如果你不喜欢它,你可以覆盖它。
一个示例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
}
}
由于Facebook仍使用OAuth 2草案0(零),因此其访问令牌不会执行HTTP
302重定向,这就是为什么processReceivedAuthorization()
它返回null
的原因。该processReceivedAuthorization()
方法允许客户端处理收到的授权,code
并
授权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 token
String accessToken = (String)request.getSession().getAttribute(Globals.SESSION_OAUTH2_ACCESS_TOKEN); //For OAuth 2 access token.
我希望这个小例子可以帮助那些热衷于使OAuth成为其开发值得经历的人。
抱歉,我找不到该community wiki
复选框。有空时访问我的博客(几乎没有内容)。
阿迪厄:-)
这是实现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());
}
}
解决方法
我在这里(SO)看到太多问题,询问有关OAuth以及如何使用OAuth协议连接到Facebook Graph API或Twitter API。
我发现了JOAuth(来自Google
Code),我想知道如何使用它?JOAuth还提供哪些其他功能,并且与其他Java oauth库配合得很好吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。