java tomcat : how to use JOAuth properly

标签 java tomcat servlets joauth

我尝试按照 JOAuth, a java-based OAuth 1 (final) and OAuth 2 (draft 10) library. How do I use it? 上的说明进行操作为了获取 Facebook 访问 token 但没有成功。

我做了以下事情:

将这些行添加到 WEB-INF/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-mapping>
 <servlet-name>OAuthServlet</servlet-name>
 <url-pattern>/oauth/*</url-pattern>
</servlet-mapping>

使用以下行创建了 WEB-INF/oauth-config.xml: (将应用程序 key 和 secret 重命名为 <APP_KEY><APP_SECRET> )

<?xml version="1.0" encoding="UTF-8"?>
<oauth-config>
<oauth name="facebook" version="2">
 <consumer key="<APP_KEY>" secret="<APP_SECRET>" />
 <provider authorizationUrl="https://graph.facebook.com/oauth/authorize" 
   accessTokenUrl="https://graph.facebook.com/oauth/access_token" />
</oauth>

<service path="/oauth_redirect" 
class="com.facebook.FacebookOAuthService" oauth="facebook">
 <success path="/start.jsp" />
</service>
</oauth-config>

我的 com.facebook.FacebookOAuthService 类(OAuth 服务):

package com.xpogames.facebook;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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://127.0.0.1:5080/Red5FacebookAuth/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#processAdditionalReceivedAccessTokenParamet    ers(javax.servlet.http.HttpServletRequest, java.util.Map)
  */
 @Override
 protected void processAdditionalReceivedAccessTokenParameters(HttpServletRequest request, Map<String, String> additionalParameters) throws OAuthException {
  // TODO Auto-generated method stub

 }   
}

最后是 start.jsp 文件,成功时用户应转发到该文件。

<%@page import="com.neurologic.oauth.util.Globals"%>

<% 
String accessToken =     (String)request.getSession().getAttribute(Globals.SESSION_OAUTH2_ACCESS_TOKEN); //For OAuth 2 access token.
%>
<%= accessToken %>

当我尝试通过将浏览器转发到 http://127.0.0.1:5080/Red5FacebookAuth/oauth/oauth_redirect 来测试它时我得到的输出是 null这意味着该属性不存在

没有错误,但我仍然没有得到正确的 token 。

我是 tomcat 和 servlet 配置的新手,所以我可能错过了一些东西。

我错过了什么?

非常感谢!

最佳答案

好吧,我以前从未回答过(因为我假设用户知道 OAuth 授权)是 OAuth 授权流程的启动

首先,按照规定的OAuth流程here 。我将根据文档向您展示如何在 Java 中完成此操作。

要使此工作流程正常工作,您需要请求授权代码(通过 OAuth 规范第 4.1.1 段中提到的授权请求)。

该方法是从 OAuth2Consumer 类调用的:

public String generateRequestAuthorizationUrl(ResponseType responseType, String redirectUri, String state, String scopeDelimiter, String... scope) throws OAuthException {

记住,Facebook 的 scopeDelimiter 是逗号 ,responseTypeResponseType.CODE范围 是 Facebook 认为的权限。

完整的例子是这样的:

String client_id = "<APP_ID>";
String client_secret = "<CLIENT_SECRET>";
String redirectUrl = "http://127.0.0.1:5080/Red5FacebookAuth/oauth/oauth_redirect"; 
OAuth2ServiceProvider provider = new OAuth2ServiceProvider("https://graph.facebook.com/oauth/authorize", "https://graph.facebook.com/oauth/access_token");
OAuth2Consumer consumer = new OAuth2Consumer(client_id, client_secret, provider);


//Using HttpServletResponse (but you can kickstart it through an Action/Controller/etc.
response.sendRedirect(consumer.generateRequestAuthorizationUrl(ResponseType.CODE, redirectUrl, null, ",", (String[])null)); //where null is the scope array,

当 Facebook 执行 HTTP 重定向时,这将依次调用您的 com.facebook.FacebookOAuthService.processReceivedAuthorizationcode 就是您从 Facebook 收到的授权代码。

希望这有帮助!

PS Facebook 在请求访问 token 时不会对您的页面进行 HTTP 重定向,因此您手动将其存储在 session 中而不是 JOAuth (它使用 OAuth 2 草稿 0) 。如果其他 OAuth 2 服务提供商在请求访问 token 后使用 HTTP-Redirect,则存储访问 token ,OAuth2Service 会自动为您执行此操作。
PPS使用任何日志框架来查看日志。

祝你好运,让我知道会发生什么!

关于java tomcat : how to use JOAuth properly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5297730/

相关文章:

javamelody tomcat虚拟主机

java - 保存 ServletHttpRequest (Java)

java - JSP 使用过滤器写入响应

java - 如何在maven项目中忽略从部署到karaf的一个包

java - 我可以在多个环境中使用单个 war 文件吗?我是不是该?

java - 带有 mod_jk 的 Apache/Tomcat 中的多个子域

Apache - Tomcat ProxyPass VirtualHost - 上下文路径

tomcat - JVM、JAVA binary 和 Tomcat..哪一个提供 servlet 容器?

java - 不断向 ExecutorService 提交 Runnable 任务,直到工作完成,得到 java.util.concurrent.RejectedExecutionException

java - 如何使用tomcat在eclipse中运行maven web应用程序