5

ここ (SO) では、OAuth について、および OAuth プロトコルを使用して Facebook Graph API または Twitter API に接続する方法を尋ねる質問が多すぎます。

(Google Code から) JOAuthを発見しました。JOAuth は他にどのような機能を提供しますか? また、他の Java oauth ライブラリとうまく連携しますか?

4

1 に答える 1

13

私が JOAuth を書いたことを見て、SO に関するこの質問に答えるのが適切だと思いました。この質問をコミュニティ ウィキにするオプションが見つかりませんでした。:(

OAuth Authorizationについて議論するためにここにいるのではないことに注意してください。これに特化したさまざまなサイトがあります。

JOAuth には素晴らしい機能があります。OAuthServletService プロバイダーからの HTTP リダイレクト応答を管理するコントローラーがあります。OAuthServletWeb アプリケーションを構成する方法は、次の<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-mapping>
  <servlet-name>OAuthServlet</servlet-name>
  <url-pattern>/oauth/*</url-pattern>
 </servlet-mapping>

これで、OAuth サーブレットのセットアップが完了したので (これは必須で<load-on-startup>はありませんが、使用する前にサーブレットを初期化するのが好きです)、JOAuth の構成について話しましょう。

デフォルトの JOAuth 構成ファイルは(したがって、サーブレット宣言に含める必要は/WEB-INF/oauth-config.xmlありません)。<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(これは、コントローラーが使用する oauth フローを知るために必要な必須の属性です)。これらには 2 つの値しか1ありません ( OAuth1 と2OAuth 2 の場合)。OAuth 2 の場合、要素にはバージョン 1 の対応<consumer>する属性がありません。requestTokenUrl

OAuth サービスは、OAuth 処理を担当するサービスです。それぞれがメソッドOAuthServiceを通じてコン​​トローラーによって呼び出されます。execute()には次の 2 種類がありますOAuthService

  • com.neurologic.oauth.service.impl.OAuth1Service.
  • com.neurologic.oauth.service.impl.OAuth2Service.

各サービスについて、OAuth 2 を使用している場合は、拡張するサービスが必要です。同じことが OAuth 1 にも当てはまります。これを行わないと、例外がスローされます。 OAuth2Service

<service>タグには、属性に一致する属性が必要です (大文字と小文字が区別されます)。name<oauth> name

OAuth1Serviceとは両方とも、OAuth 認証プロトコルのフローを最適OAuth2Service execute(HttpServletRequest, HttpServletResponse)に処理するために実装されていますが、満足できない場合はオーバーライドできます。

の例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されます (そのため、戻り値の型が期待されます)。メソッドが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());
    }
}

その他のリソース

于 2010-12-07T13:50:24.170 に答える