2010-12-27 13 views
13

का उपयोग कर एक एंड्रॉइड वेबव्यू पर प्रमाण-पत्र सेट करें, मैं एक एंड्रॉइड वेबव्यू बनाना चाहता हूं जो एक सुरक्षित HTTPS क्रेडेंशियल्स के उपयोग के साथ कनेक्शन से कनेक्ट हो।सुरक्षित HTTPS कनेक्शन

पहली कठिनाई प्रमाणपत्र (निजी) को स्वीकार करना था, इसे this बहुत उपयोगी पोस्ट के साथ हल किया गया था।

क्रेडेंशियल्स का उपयोग करने में दूसरी कठिनाई है, मुझे this पोस्ट मिला।

(डीपर्नस से पहला जवाब) जो इसके साथ बहुत अच्छी तरह से सौदा करता है, लेकिन यह HTTP कनेक्शन के बारे में बात करता है और HTTPS नहीं। मैंने कोशिश की है, लेकिन यह काम नहीं करता है, मैं बिना किसी त्रुटि संदेश के केवल साइन-इन फॉर्म पेज तक पहुंचता हूं, केवल सामान्य रिक्त रूप।

import android.app.Activity; 
import android.net.http.SslError; 
import android.os.Bundle; 
import android.webkit.HttpAuthHandler; 
import android.webkit.SslErrorHandler; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class ConnectorWebView extends Activity { 
    WebView mWebView; 
    String mUsrName; 
    String mPassC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.connwebview); 

    // Getting info from Intent extras 
    // Get it if it s different from null 
    Bundle extras = getIntent().getExtras();    
    mUsrName = extras != null ? extras.getString("username") : null; 
    mPassC = extras != null ? extras.getString("passcode") : null; 

    mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.setHttpAuthUsernamePassword("myhost.com", "myrealm", mUsrName, mPassC); 

    mWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm){ 
      handler.proceed(mUsrName, mPassC); 
     } 

     public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { 
      handler.proceed() ; 
     } 
     }); 

    mWebView.loadUrl("https://myhost.com/secured_area"); 
    } 
} 

उत्तर

3

WebView वर्ग (जैसे HttpPost या की तरह के रूप में) निम्न स्तर वर्गों का उपयोग के रूप में अपने संपर्क में के रूप में ज्यादा लचीलापन प्रदान नहीं करता है सीधे:

यहाँ मेरी कोड है।

यदि आपको सर्वर से कनेक्शन को पूरी तरह से नियंत्रित करने की आवश्यकता है - या जटिल प्राधिकरण परिदृश्यों के साथ इस तरह से निपटें - निम्न स्तर के वर्गों का उपयोग करें, डेटा पुनर्प्राप्त करें, फिर लोड करने और दिखाने के लिए WebView.loadData() का उपयोग करें एचटीएमएल

Here एसएसएल और मूलभूत प्रदाता प्रदाता का उपयोग कर सामग्री लोड करने का एक अच्छा उदाहरण है। इसके परिणामस्वरूप ऊपर वर्णित वेबव्यू में लोड किया जा सकता है।

+0

ऐसा लगता है कि कोई और जवाब नहीं होने वाला है इसलिए मैं आपको बक्षीस देने के लिए जा रहा हूं।इसे खोने में कोई बात नहीं :) –

+0

"जटिल प्राधिकरण परिदृश्य" हाहाहहाह, यह साल पहले से पूरी तरह से मानक आरएफसी है, वेबव्यू इसे संभालना चाहिए ... – Nappy

+0

जबकि मैं सहमत हूं कि इसे "चाहिए" - और मेरी इच्छा है! - वेबव्यू केवल व्यवहार के एक निश्चित सबसेट का खुलासा करता है कि पूर्ण HTTP लाइब्रेरी का समर्थन करता है ... – elijah

13

ऐसा लगता है के रूप में है कि WebView देशी रूप Basic प्रमाणीकरण संभाल सकते हैं जब HTTPS का उपयोग कर, मैं Authorization हैडर (इनकोडिंग नाम/पासवर्ड से युक्त) मैन्युअल रूप से स्थापित करने के विचार के साथ शुरू कर दिया।

यहाँ मैं कैसे लगता है कि यह किया जा सकता है है:

import org.apache.commons.codec.binary.Base64; 

// ... 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.connwebview); 

    // Getting info from Intent extras 
    // Get it if it s different from null 
    Bundle extras = getIntent().getExtras();    
    mUsrName = extras != null ? extras.getString("username") : null; 
    mPassC = extras != null ? extras.getString("passcode") : null; 

    mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    // mWebView.setHttpAuthUsernamePassword("myhost.com", 
    //         "myrealm", 
    //         mUsrName, 
    //         mPassC); 

    mWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedHttpAuthRequest(WebView view, 
              HttpAuthHandler handler, 
              String host, 
              String realm){ 
     handler.proceed(mUsrName, mPassC); 
     } 

     public void onReceivedSslError(WebView view, 
            SslErrorHandler handler, 
            SslError error) { 
     handler.proceed() ; 
     } 
    }); 

    String up = mUserName +":" +mPassC; 
    String authEncoded = new String(Base64.encodeBase64(up.getBytes())); 
    String authHeader = "Basic " +authEncoded; 
    Map<String, String> headers = new HashMap<String, String>(); 
    headers.put("Authorization", authHeader); 
    mWebView.loadUrl("https://myhost.com/secured_area", headers); 
} 

यह WebView.loadUrl (String url, Map<String, String> additionalHttpHeaders) विधि का लाभ लेता है और इस उदाहरण के लिए मैं Apache Commons से Base64Encoder उपयोग कर रहा हूँ। बेस 64 एन्कोडर भाग काफी छोटा है और यदि आप अपने आवेदन में बाहरी पुस्तकालयों को शामिल नहीं करना चाहते हैं (किसी भी कारण से), तो आप हमेशा अपना own (reference) लिख सकते हैं।

यह भी ध्यान दें कि उपरोक्त WebView.loadUrl (String url, Map<String, String> additionalHttpHeaders) विधि केवल API 8+ में उपलब्ध है। संदर्भ के लिए, Basic Authentication पर विकिपीडिया आलेख भी देखें (जो हेडर आदि पर चर्चा करता है)।

+0

शानदार समाधान! मेरे मामले में, मैंने सर्वर ऑटो लॉगिन फॉर्म पर लागू किया है, जब उपयोगकर्ता पहचाना नहीं गया है, इसलिए वेबव्यूक्लिंट के साथ समाधान काम नहीं कर रहा था, लेकिन हेडर मानचित्र अच्छी तरह से काम कर रहा है! धन्यवाद! – Krystian

0

वैकल्पिक परिदृश्य:

हैं roundabout 10 lines of javascript using jQuery लिखने के लिए तैयार

, इस परिदृश्य बल्कि सरल है।

Inject your javascript code into the webview या यदि आप जिस HTML पृष्ठ को प्रदर्शित कर रहे हैं उसे नियंत्रित कर रहे हैं, तो उसे वहां शामिल करें।

यदि आपको interface back from javascript की आवश्यकता है, तो आप ऐसा कर सकते हैं। भारी कमांड एक्सचेंज के लिए, CordovaWebView -Interface का उपयोग करें जिसमें एपीआई स्तर के आधार पर कम देरी हो।

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