2010-12-07 11 views
5

मैंने ओएथ प्रोटोकॉल का उपयोग करके ओएथ के बारे में पूछने और फेसबुक ग्राफ एपीआई या ट्विटर एपीआई से कनेक्ट करने के लिए यहां बहुत सारे प्रश्न देखे हैं (एसओ)।जॉआथ, जावा आधारित ओएथ 1 (फाइनल) और ओएथ 2 (ड्राफ्ट 10) लाइब्रेरी। मैं इसे कैसे इस्तेमाल करूं?

मैंने JOAuth (Google कोड से) की खोज की है और मैं सोच रहा था कि मैं इसका उपयोग कैसे कर सकता हूं? JOAuth अन्य सुविधाएं प्रदान करता है और क्या यह अन्य जावा ओथ पुस्तकालयों के साथ अच्छी तरह से किराया करता है?

+0

कृपया नए अपडेट के लिए समय-समय पर जांच करें (बस लाइब्रेरी अपडेट करें) और, यदि संभव हो तो प्रतिक्रिया दें। –

+0

नमस्ते मैं tomcat servlets और सेवाओं के लिए काफी नया हूँ। मैं http://stackoverflow.com/questions/5297730/java-tomcat-how-to-use-joauth-properly पर एक प्रश्न पोस्ट करता हूं, कृपया मुझे बताएं कि अगर आप – ufk

+0

@ufk में सहायता कर सकते हैं, तो जॉयथ का उपयोग करने के लिए धन्यवाद '। मैंने तदनुसार आपकी पोस्ट का जवाब दिया है। अगर यह उठता है तो मुझे अन्य मुद्दों के बारे में बताएं। पीएस, आपने जॉयथ के बारे में कैसे सुना? –

उत्तर

13

यह देखते हुए कि मैंने जॉयथ लिखा है, मैंने सोचा कि SO पर इस प्रश्न का उत्तर देना उचित होगा। मुझे इस सवाल को एक समुदाय विकी बनाने का विकल्प नहीं मिला। :(

नोट मैं यहाँ OAuth Authorization चर्चा करने के लिए नहीं कर रहा हूँ। इस के लिए समर्पित विभिन्न साइटों रहे हैं।

JOAuth एक अद्भुत सुविधा के साथ आता है। यह एक नियंत्रक OAuthServlet का प्रबंधन करता है कि आपके HTTP से प्रतिक्रिया पुन: निर्देशित किया है । सेवा प्रदाता अपने वेब आवेदन करने के लिए OAuthServlet कॉन्फ़िगर करने के लिए जिस तरह से, बस यह एक <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।

डिफ़ॉल्ट जॉयथ कॉन्फ़िगरेशन फ़ाइल /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 प्रवाह का उपयोग करने के लिए पता करने के लिए है) है कि ध्यान देंगे। ये केवल में OAuth1 के लिए 2 संभावित मान (1 और OAuth 2 के लिए 2) हैं। ओएथ 2 के लिए, <consumer> तत्व में requestTokenUrl विशेषता है जो इसके संस्करण 1 समकक्ष की तरह है।

ओएथ सेवा ओएथ हैंडलिंग के लिए जिम्मेदार है। प्रत्येक OAuthService को execute() विधि के माध्यम से नियंत्रक द्वारा बुलाया जाता है।

  • com.neurologic.oauth.service.impl.OAuth1Service: OAuthService के 2 प्रकार के होते हैं।
  • com.neurologic.oauth.service.impl.OAuth2Service

नोट प्रत्येक सेवा के लिए, यदि आप OAuth 2 का उपयोग कर रहे हैं, तो आप चाहिए एक सेवा है जो फैलीOAuth2Service है। ओएथ के लिए भी यही लागू होता है 1. ऐसा करने में असफलता को अपवाद में फेंक दिया जाता है।

प्रत्येक <service> टैग चाहिए एक name विशेषता है कि मैचों<oauth>name विशेषता (केस संवेदी)।

दोनों OAuth1Service और OAuth2Serviceexecute(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 

} 
} 

के बाद से फेसबुक अभी भी OAuth 2 मसौदा 0 (शून्य) का उपयोग करता है, उनकी पहुँच टोकन एक HTTP 302 रीडायरेक्ट नहीं करता है, और क्यों processReceivedAuthorization() एक अशक्त रिटर्न है कि है। processReceivedAuthorization() विधि क्लाइंट को प्राप्त ऑटोराइजेशन code और संसाधित करने की अनुमति देता है एक प्राधिकरण URL (यही कारण है कि यह String का रिटर्न प्रकार की अपेक्षा करता है)। यदि विधि null या खाली स्ट्रिंग देता है, तो एक यूआरएल रीडायरेक्ट कभी नहीं होता है।

एक बार ओथ प्रवाह पूरा हो जाने के बाद, <success> तत्व में पथ को तब (RequestDispatcher के माध्यम से) कहा जाता है, यह दिखाने के लिए कि ओथ सफलतापूर्वक पूरा हो गया है।

पहुंच टोकन, (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 उनके विकास के लिए एक worthwile अनुभव बनाने में इच्छुक हैं मदद करता है।

क्षमा करें कि मुझे community wiki चेकबॉक्स नहीं मिला। आपके पास समय होने पर मेरे ब्लॉग पर जाएं (जिसमें लगभग कुछ भी नहीं है)।

विदाई :-)

पुनश्च यह 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()); 
    } 
} 

अतिरिक्त संसाधन

संबंधित मुद्दे