2

JavaベースのOAuth 1(最終)およびOAuth 2(ドラフト10)ライブラリであるJOAuthの指示に従おうとしました。どうやって使うの?Facebookのアクセストークンを取得するために成功しませんでした。

私は次のことをしました:

これらの行を 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 を作成しました: (アプリ キーとシークレットの名前を<APP_KEY>and に変更<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 クラス ( The OAuth Service ):

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は属性が存在しないことを意味します

エラーはありませんが、適切なトークンを取得できません。

私はTomcatとサーブレットの設定が初めてなので、何かを見落としているかもしれません。

私は何が欠けていますか?

どうもありがとう!

4

1 に答える 1

4

ユーザーが OAuth 認可を知っていると想定したため、これまで答えなかったのは、OAuth 認可フローの開始です。

まず、ここで規定されている OAuth フローに従います。文書化されている内容に基づいて、Javaでどのように行われるかを示しています。

このワークフローが機能するには、認証コードを要求する必要があります (OAuth 仕様のパラグラフ 4.1.1 で説明されているように、認証要求を通じて)。

そのメソッドはOAuth2Consumerクラスから呼び出されます:

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

覚えておいてください。FacebookscopeDelimiterはコンマ,でありresponseTypeResponseType.CODE. scopeFacebook がパーミッションとして認識するものです。

完全な例は次のとおりです。

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,

これは、com.facebook.FacebookOAuthService.processReceivedAuthorizationFacebook が HTTP リダイレクトを行うときにあなたを呼び出します。はcode、Facebook から受け取った認証コードです。

お役に立てれば!

PS Facebook は、アクセス トークンを要求するときにページへの HTTP リダイレクトを行わないため、JOAuth ではなくセッションに手動で保存する理由 (OAuth 2 ドラフト 0 を使用)。他の OAuth 2 サービス プロバイダーがアクセス トークンの要求後に HTTP リダイレクトを使用する場合は、アクセス トークンを保存しないOAuth2Serviceでください。 が自動的に保存します。
PPSログを表示するには、任意のロギング フレームワークを使用します。

頑張って、何が起こるか教えてください!

于 2011-03-14T20:36:39.010 に答える