gpt4 book ai didi

java - JOAuth,一个基于 java 的 OAuth 1(最终版)和 OAuth 2(草案 10)库。我该如何使用它?

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:18 25 4
gpt4 key购买 nike

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

我发现了 JOAuth (来自谷歌代码)我想知道如何使用它? JOAuth 还提供了哪些其他功能?它是否与其他 Java oauth 库配合得很好?

最佳答案

看到自己写过JOAuth,觉得还是在SO上回答这个问题比较合适。我没有找到将此问题设为社区 Wiki 的选项。 :(

注意我不是来讨论的OAuth Authorization .有各种网站专门用于此目的。

JOAuth 有一个很棒的功能。它有一个 Controller 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 (因此在您的 servlet 声明中它不必是 <init-param>)。配置文件如下所示:

<?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属性(这是 Controller 需要知道要使用哪个 oauth 流的强制属性)。这些有2个可能的值(OAuth1为1,OAuth 2为2)。对于 OAuth 2,<consumer>元素没有 requestTokenUrl属性类似于其版本 1 对应项。

OAuth 服务负责处理 OAuth。每个OAuthService由 Controller 通过 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 授权协议(protocol)的流程,但如果您对它不满意,您可以覆盖它。

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(零),他们的访问 token 不执行 HTTP 302 重定向,这就是为什么 processReceivedAuthorization()是返回一个空值。processReceivedAuthorization()方法允许客户端处理收到的授权 code期望 一个授权 URL(这就是为什么它期望返回类型为 String 的原因)。如果该方法返回 null或空字符串,永远不会发生 url 重定向。

oauth 流程完成后,<success> 中的路径然后调用元素(通过 RequestDispatcher ),以表明 OAuth 已成功完成。

要访问访问 token (通过 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 成为他们开发的有值(value)体验的人。

抱歉,我找不到 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());
}
}

其他资源

关于java - JOAuth,一个基于 java 的 OAuth 1(最终版)和 OAuth 2(草案 10)库。我该如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4376612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com