2016-07-08 5 views
5

मैं एक स्थानीय जावा-आधारित क्लाइंट बनाने की कोशिश कर रहा हूं जो SurveyMonkey API के साथ इंटरैक्ट करता है।क्या रीडायरेक्ट सर्वर के बिना OAuth 2.0 का उपयोग करना संभव है?

SurveyMonkey को OAuth 2.0 का उपयोग करके एक लंबे समय तक पहुंच टोकन की आवश्यकता होती है, जिसे मैं बहुत परिचित नहीं हूं।

मैं घंटों के लिए इस googling किया गया है, और मुझे लगता है कि जवाब नहीं है, लेकिन मैं सिर्फ यह सुनिश्चित होना चाहते हैं:

मुझे एक साधारण जावा ग्राहक कि SurveyMonkey साथ सूचना का आदान लिखने के लिए क्या यह संभव है, कुछ क्लाउड में अपना खुद का रीडायरेक्ट सर्वर सेट किए बिना?

मुझे लगता है कि ओएथ 2.0 द्वारा उत्पन्न बेयरर टोकन प्राप्त करने में सक्षम होने के लिए मेरी अपनी ऑनलाइन सेवा अनिवार्य है। क्या यह संभव है कि मेरे पास सर्वेमॉन्की सीधे मेरे क्लाइंट को बेयरर टोकन नहीं भेज सकता है?

और अगर मैं कहीं मेरे स्वयं के कस्टम सर्वलेट की स्थापना की है, और एक redirect_uri के रूप में उपयोग करने के लिए थे, इस प्रकार है तो सही प्रवाह होगा के रूप में:

  1. जावा ग्राहक के अनुरोध के वाहक टोकन SurveyMonkey से, साथ redirect_uri मेरा स्वयं का कस्टम सर्वलेट यूआरएल है।
  2. SurveyMonkey मेरे कस्टम सर्वलेट यूआरएल को टोकन भेजता है।
  3. जावा-क्लाइंट चुनाव कस्टम सर्वलेट यूआरएल टोकन उपलब्ध होने तक उपलब्ध है?

क्या यह सही है?

+0

अगर यह किसी भी मदद की है मैं नहीं जानता, लेकिन गूगल प्रमाणन के लिए मैं से मेरी पुनर्निर्देश url प्राप्त: = नए LocalServerReceiver \t VerificationCodeReceiver रिसीवर(); रिसीवर = प्रीकंडिशन। चेक नॉटनुल (रिसीवर); स्ट्रिंग रीडायरेक्ट Uri = receiver.getRedirectUri(); – c0der

उत्तर

6

बिल्कुल नहीं, ओएथ प्रवाह का पूरा बिंदु यह है कि उपयोगकर्ता (जिस ग्राहक से आप डेटा तक पहुंच रहे हैं) आपको अपने डेटा तक पहुंचने की अनुमति देता है।

authentication instructions देखें। आप OAuth अधिकृत पृष्ठ पर उपयोगकर्ता को भेजने की जरूरत:।

https://api.surveymonkey.net/oauth/authorize?api_key<your_key>&client_id=<your_client_id>&response_type=code&redirect_uri=<your_redirect_uri> 

इससे उन्हें बता उपयोगकर्ता जो अपने अकाउंट आप (पूर्व के लिए उपयोग का अनुरोध कर रहे के कुछ हिस्सों को अपने सर्वेक्षण देखते हैं, अपनी प्रतिक्रिया देखने के लिए एक पृष्ठ दिखाएगा, आदि)। एक बार जब उपयोगकर्ता उस पृष्ठ पर "प्राधिकृत" पर क्लिक करके अनुमोदित करता है, तो SurveyMonkey स्वचालित रूप से आपके रीडायरेक्ट यूआरआई के रूप में सेट किए गए किसी भी चीज़ पर जायेगा (सुनिश्चित करें कि आपके ऐप के लिए सेटिंग में सेट किए गए मैचों के ऊपर यूआरएल से एक सुनिश्चित करें) कोड के साथ ।

इसलिए यदि आपके रीडायरेक्ट URL https://example.com/surveymonkey/oauth था, SurveyMonkey उपयोगकर्ता एक कोड के साथ कि URL पर रीडायरेक्ट करेगा:

https://example.com/surveymonkey/oauth?code=<auth_code>

आपको लगता है कि कोड लेने के लिए और फिर एक करके पहुँच टोकन के यह आदान-प्रदान करने की जरूरत है निम्नलिखित पोस्ट पैरामीटर वाला https://api.surveymonkey.net/oauth/token?api_key=<your_api_key> को पोस्ट अनुरोध:

client_secret=<your_secret> 
code=<auth_code_you_just_got> 
redirect_uri=<same_redirect_uri_as_before> 
grant_type=authorization_code 

यह एक पहुँच टोकन वापस आ जाएगी, तो आप उपयोगकर्ता के खाते पर डेटा का उपयोग करने कि पहुँच टोकन उपयोग कर सकते हैं। आप उपयोगकर्ता के खाते तक पहुंचने के लिए उपयोग करने के लिए उपयोगकर्ता के लिए पहुंच टोकन नहीं देते हैं। मतदान या कुछ भी करने की ज़रूरत नहीं है।

यदि आप केवल अपने खाते तक पहुंच रहे हैं, तो आप अपने ऐप के सेटिंग पेज में उपलब्ध पहुंच टोकन का उपयोग कर सकते हैं।अन्यथा उपयोगकर्ता के लिए अपना खुद का रीडायरेक्ट सर्वर सेट किए बिना एक्सेस टोकन प्राप्त करने का कोई तरीका नहीं है (जब तक कि सभी उपयोगकर्ता आपके जैसे ही समूह में नहीं हैं, यानी एक ही खाते के तहत एकाधिक उपयोगकर्ता हैं, लेकिन मैं इसमें शामिल नहीं होगा)। उपयोगकर्ता द्वारा प्राधिकृत किए जाने के बाद सर्वेक्षण प्रबंधक को आपको कोड भेजने के लिए एक स्थान की आवश्यकता होती है, आप केवल एक का अनुरोध नहीं कर सकते हैं।

+0

सेटिंग्स पैनल के बारे में आपका अंतिम सुझाव: मैं इसे और साथ ही कामकाज की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। क्या मेरे लिए यह मानना ​​सही है कि "मेरे ऐप्स" अनुभाग में "एक्सेस टोकन" एक भावी टोकन है जिसका उपयोग मैं एक निजी ऐप के लिए कर सकता हूं? – Tovi7

+1

@ टोवी 7 हां, आप ऐप के मालिक के उसी खाते तक पहुंचने के लिए भालू में इसका उपयोग कर सकते हैं। ऐप मालिक के खाते तक पहुंचने के लिए इसका उपयोग हमेशा ऐप मालिक के खाते तक पहुंचने के लिए किया जा सकता है, भले ही ऐप किस स्थिति में है (अक्षम से अलग)। –

+0

इसके अलावा, अगर आप रुचि रखते हैं, तो आपके समूह के उपयोगकर्ताओं (केस: निजी ऐप), या अपने खाते (क्लाइंट_credentials grant_type) के लिए एक्सेस टोकन प्राप्त करने का एक तरीका होगा। यदि आप परिवर्तनों के अधिसूचित होने में रुचि रखते हैं तो आप दस्तावेज़ों को https://github.com/SurveyMonkey/public_api_docs पर देख सकते हैं। –

5

हां, कॉलबैक यूआरएल के बिना ओएथ 2 का उपयोग करना संभव है। RFC6749 कई प्रवाह प्रस्तुत करता है। Implicit और Authorization Code अनुदान प्रकारों को एक पुनर्निर्देशन यूआरआई की आवश्यकता होती है। हालांकि Resource Owner Password Credentials अनुदान प्रकार नहीं है।

एक आईईटीएफ ड्राफ्ट है जो सीमित उपकरणों (https://tools.ietf.org/html/draft-ietf-oauth-device-flow) के लिए एक और अनुदान प्रकार पेश करने का प्रयास करता है, जिसके लिए किसी भी रीडायरेक्ट यूआरआई की आवश्यकता नहीं होती है।

किसी भी मामले में, यदि उपरोक्त अनुदान प्रकार आपकी आवश्यकताओं पर फिट नहीं होते हैं, तो आपको custom grant type बनाने से रोकता है।

2

आप को कुछ ऐसा करने की आवश्यकता है जो redirect_uri के रूप में कार्य करेगी, जिसे आपके क्लाइंट (जैसा कि आप कहते हैं, कुछ क्लाउड में) कहीं और होस्ट करने की आवश्यकता नहीं है।

मैं जावा और सर्विलेट से बहुत परिचित नहीं हूं, लेकिन अगर मैं सही ढंग से मानता हूं, तो यह कुछ ऐसा होगा जो http://localhost:some_port को संभाल सकता है। उस स्थिति में, आपके द्वारा वर्णित प्रवाह सही है।

मैंने सी # में सफलतापूर्वक उसी प्रवाह को लागू किया। यहां वह वर्ग है जो उस प्रवाह को लागू करता है। मुझे उम्मीद है यह मदद करेगा।

class OAuth2Negotiator 
{ 
    private HttpListener _listener = null; 
    private string _accessToken = null; 
    private string _errorResult = null; 
    private string _apiKey = null; 
    private string _clientSecret = null; 
    private string _redirectUri = null; 

    public OAuth2Negotiator(string apiKey, string address, string clientSecret) 
    { 
     _apiKey = apiKey; 
     _redirectUri = address.TrimEnd('/'); 
     _clientSecret = clientSecret; 

     _listener = new HttpListener(); 
     _listener.Prefixes.Add(address + "/"); 
     _listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous; 
    } 

    public string GetToken() 
    { 
     var url = string.Format(@"https://api.surveymonkey.net/oauth/authorize?redirect_uri={0}&client_id=sm_sunsoftdemo&response_type=code&api_key=svtx8maxmjmqavpavdd5sg5p", 
       HttpUtility.UrlEncode(@"http://localhost:60403")); 
     System.Diagnostics.Process.Start(url); 

     _listener.Start(); 
     AsyncContext.Run(() => ListenLoop(_listener)); 
     _listener.Stop(); 

     if (!string.IsNullOrEmpty(_errorResult)) 
      throw new Exception(_errorResult); 
     return _accessToken; 
    } 

    private async void ListenLoop(HttpListener listener) 
    { 
     while (true) 
     { 
      var context = await listener.GetContextAsync(); 
      var query = context.Request.QueryString; 
      if (context.Request.Url.ToString().EndsWith("favicon.ico")) 
      { 
       context.Response.StatusCode = (int)HttpStatusCode.NotFound; 
       context.Response.Close(); 
      } 
      else if (query != null && query.Count > 0) 
      { 
       if (!string.IsNullOrEmpty(query["code"])) 
       { 
        _accessToken = await SendCodeAsync(query["code"]); 
        break; 
       } 
       else if (!string.IsNullOrEmpty(query["error"])) 
       { 
        _errorResult = string.Format("{0}: {1}", query["error"], query["error_description"]); 
        break; 
       } 
      } 
     } 
    } 

    private async Task<string> SendCodeAsync(string code) 
    { 
     var GrantType = "authorization_code"; 
     //client_secret, code, redirect_uri and grant_type. The grant type must be set to “authorization_code” 
     var client = new HttpClient(); 
     client.BaseAddress = new Uri("https://api.surveymonkey.net"); 
     var request = new HttpRequestMessage(HttpMethod.Post, string.Format("/oauth/token?api_key={0}", _apiKey)); 

     var formData = new List<KeyValuePair<string, string>>(); 
     formData.Add(new KeyValuePair<string, string>("client_secret", _clientSecret)); 
     formData.Add(new KeyValuePair<string, string>("code", code)); 
     formData.Add(new KeyValuePair<string, string>("redirect_uri", _redirectUri)); 
     formData.Add(new KeyValuePair<string, string>("grant_type", GrantType)); 
     formData.Add(new KeyValuePair<string, string>("client_id", "sm_sunsoftdemo")); 

     request.Content = new FormUrlEncodedContent(formData); 
     var response = await client.SendAsync(request); 
     if (!response.IsSuccessStatusCode) 
     { 
      _errorResult = string.Format("Status {0}: {1}", response.StatusCode.ToString(), response.ReasonPhrase.ToString()); 
      return null; 
     } 

     var data = await response.Content.ReadAsStringAsync(); 
     if (data == null) 
      return null; 
     Dictionary<string, string> tokenInfo = JsonConvert.DeserializeObject<Dictionary<string, string>>(data); 
     return(tokenInfo["access_token"]); 
    } 
} 
संबंधित मुद्दे