当前位置: 首页 > 面试题库 >

JOAuth,一个基于Java的OAuth 1(最终版本)和OAuth 2(草案10)库。如何使用?

严信瑞
2023-03-14
问题内容

我在这里(SO)看到太多问题,询问有关OAuth以及如何使用OAuth协议连接到Facebook Graph API或Twitter API。

我发现了JOAuth(来自Google
Code),我想知道如何使用它?JOAuth还提供哪些其他功能,并且与其他Java oauth库配合得很好吗?


问题答案:

看到我已经写了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和2OAuth 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属性(区分大小写)。

双方OAuth1ServiceOAuth2Service 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复选框。有空时访问我的博客(几乎没有内容)。

阿迪厄:-)

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;

/**
 * @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());
    }
}


 类似资料:
  • 我正在使用maven 3.1.1,我有以下问题 我有一个主项目(pom.xml),它将被编译为WAR文件。它有两个模块。 模块1有以下内容(请注意工件的版本) 模块2有以下内容(请注意工件的版本) 因此,我的项目依赖于同一个库的两个版本。问题是库版本2与版本1不向后兼容。所以,我不能只包括版本2。 我正在考虑修改模块1以使用库版本2,但这需要大量时间。因此,我正在寻找一种方法来包含库的两个版本。

  • 本文向大家介绍Java中的StringBuffer是最终版本吗?,包括了Java中的StringBuffer是最终版本吗?的使用技巧和注意事项,需要的朋友参考一下 是的,StringBuffer类是最终的Java。我们不能覆盖此类。

  • 我有两个maven项目:projA和projB 投射依赖于投射 PropB依赖于泽西2.15 projA依赖于hbase测试UTIL hbase测试UTIL取决于1.8。十、 如果projB在没有任何排除的情况下声明了对projA的依赖,那么projB的测试将失败,因为它们使用了Jersey项目中某个类的错误版本(1.8.x)。 如果詹姆士声明依赖于詹姆士组件,那么上面的问题就消失了。但是,新的问

  • 我正在编写一个小的应用程序,它有一个链接到数据库的身份验证,这个身份验证将由Oauth2方面(由@enableAuthorizationServer和@enableResourceServer注释的类)管理。在同一个应用程序中,管理页面有另一个身份验证,该页面将链接到另一个不同的数据库,并将使用常规的基于表单的身份验证。 为此,我编写了以下Web安全配置类: 其他相关组成部分有: 授权服务器配置:

  • 我们的项目由几个子应用程序组成,我们正在寻找实现SSO的解决方案,以避免每个子应用程序的身份验证。 假设这是我们项目的结构: 我们发现有很多关于“基于OAuth2实现SSO”的文章都是这样的。 在那篇文章中,我们更喜欢策略,因为它简单明了,但是本机应用程序有一些限制,然后我们专注于OAuth2。 这是工作流程: 1 OAuth2中的规则 资源服务器(SP)-这是您尝试访问信息的Web服务器。 客户

  • 问题内容: 我正在寻找在Java集合上创建多个索引的最基本的解决方案。 所需功能: 删除值时,必须删除与该值关联的所有索引条目。 索引查找必须比线性搜索更快(至少与TreeMap一样快)。 附带条件: 不依赖大型(如Lucene)库。没有不常见或未经良好测试的库。没有数据库。 像Apache Commons Collections等之类的库就可以了。 如果它仅与JavaSE(6.0)一起工作,那就