Joauth,位于Java的Oauth 1(最终)和OAuth 2(草稿10)库。我如何使用它?

StackOverflow https://stackoverflow.com/questions/4376612

  •  09-10-2019
  •  | 
  •  

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

我发现了 约阿斯 (来自Google代码),我想知道如何使用它? 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和 2 对于Oauth 2)。对于Oauth 2, <consumer> 元素没有 requestTokenUrl 像版本1的属性一样。

OAuth服务是负责Oauth处理的一项服务。每个 OAuthService 由控制器通过 execute() 方法。有两种类型的 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() 返回零。这 processReceivedAuthorization() 方法允许客户处理接收的自动化 code期望 授权URL(这就是为什么它期望返回类型的 String)。如果该方法返回 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 复选框。有时间时,请访问我的博客(几乎什么都没有)。

adieu :-)

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

其他资源

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top