2010-04-06 3 views
18

Я пытаюсь выполнить базовую аутентификацию для просмотра защищенного URL-адреса. Я хочу, чтобы получить доступ к защищенному URL, который выглядит следующим образом:Использование WebView setHttpAuthUsernamePassword?

http://api.test.com/userinfo/vid?=1234 

Так что я следующий с WebView:

mWebView.setHttpAuthUsernamePassword("api.test.com", "", "[email protected]", "mypassword"); 
mWebView.loadUrl("http://api.test.com/userinfo/user?uid=53461"); 

но аутентификация не похоже на работу, я просто получаю страница ошибки вывода. Я правильно использую метод WebView здесь?

Update: Попытка с завитком:

curl -u [email protected]:mypassword http://api.test.com/userinfo/user?uid=53461 

и тянет страницу штраф. Я пробовал каждую комбинацию параметра хоста, владельцы api не знают, что я имею в виду под «королевством» (и я тоже), - какую информацию я могу дать им, чтобы помочь этому?

Благодаря

+1

Где вы определили защиту, файл Htaccess? Вы можете попробовать полный путь к папке 'http: // api.test.com/userinfo /' – Pentium10

+0

иначе вам нужно установить метку разрешения в файле AndroidManifest. – Praveen

+0

Вы когда-нибудь решали это? – jamesc

ответ

0

Вам может понадобиться что-то другое, чем "" для второго параметра. Обратитесь к разработчику веб-сайта и узнайте, какой должна быть соответствующая область. Или используйте инструменты, например curl, чтобы узнать, что такое царство.

+0

Хорошо, поэтому я попробовал с завитком, и он отлично работает при поставке только имени пользователя + пароля - обдумал Q, не уверен, почему он все еще не хочет работать? – user246114

1

В этом примере области является By Invitation Only

AuthType Basic 
AuthName "By Invitation Only" 
AuthUserFile /usr/local/apache/passwd/passwords 
Require user rbowen sungo 
+0

Привет, Pentium, откуда вы взяли этот пример? – user246114

+1

Директива AuthName устанавливает значение Realm для аутентификации. Область служит двум основным функциям. Во-первых, клиент часто представляет эту информацию пользователю как часть диалогового окна пароля. Во-вторых, он используется клиентом для определения того, какой пароль отправить для данной аутентифицированной области. http://httpd.apache.org/docs/2.0/howto/auth.html – Pentium10

+0

Это сработало для меня. Установите мое царство (обнаруженное с помощью curl -I hostname), и я готов идти. Трюк webviewclient, похоже, не играет хорошо с телефонной связью (ymmv). – jettero

93

Другой вариант заключается в использовании WebViewClient;

webview.setWebViewClient(new MyWebViewClient()); 

private class MyWebViewClient extends WebViewClient { 
@Override 
public void onReceivedHttpAuthRequest(WebView view, 
     HttpAuthHandler handler, String host, String realm) { 

    handler.proceed("[email protected]", "mypassword"); 

} 
} 
+3

да, пожалуйста, отметьте это. это работало здесь, тогда как mWebView.setHttpAuthUsernamePassword этого не делал. –

+0

Отлично! Это работало для проверки подлинности прокси-сервера в моей сети Wi-Fi компании. – bob

+1

Итак, я полагаю, мне нужно создать собственное представление для запроса учетных данных? это немой –

0

Я никогда не получить setHttpAuthUsernamePassword работать с FileTransfer.download PhoneGap в (так как он не использует WebView), но я DID получить эту работу с PhoneGap. Стоит отметить, что в этом потоке заканчиваются другие пользователи телефонных разговоров.

Authenticator.setDefault(new Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(user, pass.toCharArray()); 
     } 
    }); 
7

Поведение WebView по умолчанию заключается в отбрасывании всех запросов на аутентификацию. Даже если setHttpAuthUsernamePassword.

Вы должны установить WebViewClient и переопределить метод onReceivedHttpAuthRequest

7
webview.setWebViewClient(new WebViewClient() { 

    public void onReceivedHttpAuthRequest(WebView view, 
      HttpAuthHandler handler, String host, String realm) { 

     handler.proceed("login", "pass"); 
    } 
}); 
+1

Я не рекомендую использовать этот метод. Если вы указали неправильное имя пользователя или пароль, аутентификация завершается неудачно, и веб-просмотр продолжает повторять попытку авторизации. Это создавало повторяющиеся вызовы api на моем сервере, которые закончили работу сервера. Вы можете использовать счетчик повторов и метод WebView.stopLoading(), чтобы избежать бесконечного цикла. –

0

Это так глупо. Я взломал что-то вместе, что сработало для меня, я надеюсь, что это сработает и для вас.

public class AuthRequestDialogFragment extends DialogFragment 
{ 
    @InjectView(R.id.dauth_userinput) 
    public EditText userinput; 

    @InjectView(R.id.dauth_passinput) 
    public EditText passinput; 

    @OnClick(R.id.dauth_login) 
    public void login(View view) { 
     ((Callback) getTargetFragment()).login(userinput.getText().toString(), passinput.getText().toString()); 
     this.dismiss(); 
    } 

    @OnClick(R.id.dauth_cancel) 
    public void cancel(View view) { 
     ((Callback) getTargetFragment()).cancel(); 
     this.dismiss(); 
    } 

    public static interface Callback 
    { 
     public void login(String username, String password); 
     public void cancel(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 
     int width = display.getWidth(); 
     int height = display.getHeight(); 

     getDialog().getWindow().setLayout(width*2/3, height/5*2); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View view = inflater.inflate(R.layout.dialog_authrequest, container); 
     ButterKnife.inject(this, view); 
     getDialog().setTitle("Authorization required"); 
     return view; 
    } 
} 

И

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 
    <TextView 
     android:id="@+id/dauth_requsertext" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="The server requires a username and password." 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="15dp" 
     android:layout_marginStart="15dp" 
     android:layout_marginTop="15dp"/> 


    <RelativeLayout 
     android:id="@+id/dauth_centercontainer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true"> 
     <TextView 
      android:id="@+id/dauth_usertext" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Username" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentLeft="true" 
      android:layout_marginLeft="15dp" 
      android:layout_marginStart="15dp" 
      android:layout_marginTop="15dp"/> 
     <TextView 
      android:id="@+id/dauth_passtext" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="20dp" 
      android:text="Password" 
      android:layout_below="@+id/dauth_usertext" 
      android:layout_alignLeft="@+id/dauth_usertext" 
      android:layout_alignStart="@+id/dauth_usertext"/> 
     <EditText 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/dauth_userinput" 
      android:ems="12" 
      android:layout_alignBottom="@+id/dauth_usertext" 
      android:layout_toRightOf="@id/dauth_usertext" 
      android:layout_toEndOf="@id/dauth_usertext"/> 
     <EditText 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/dauth_passinput" 
      android:layout_marginTop="20dp" 
      android:inputType="textPassword" 
      android:ems="12" 
      android:layout_alignBottom="@+id/dauth_passtext" 
      android:layout_toRightOf="@id/dauth_passtext" 
      android:layout_toEndOf="@id/dauth_passtext" 
      android:layout_alignLeft="@id/dauth_userinput" 
      android:layout_alignStart="@id/dauth_userinput"/> 

    </RelativeLayout> 

    <Button 
     android:id="@+id/dauth_cancel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Cancel" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginBottom="15dp" 
     android:layout_marginRight="15dp" 
     android:layout_marginEnd="15dp"/> 


    <Button 
     android:id="@+id/dauth_login" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Log In" 
     android:layout_alignTop="@+id/dauth_cancel" 
     android:layout_marginRight="15dp" 
     android:layout_marginEnd="15dp" 
     android:layout_toLeftOf="@+id/dauth_cancel"/> 



</RelativeLayout> 

И

public class WebViewFragment extends Fragment implements AuthRequestDialogFragment.Callback { 

    @Override 
    public void login(String username, String password) { 
     Log.d(this.getClass().getName(), "Login"); 
     myWebViewClient.login(username, password); 
    } 

    @Override 
    public void cancel() { 
     Log.d(this.getClass().getName(), "Cancel"); 
     myWebViewClient.cancel(); 
    } 

И самое главное:

private class MyWebViewClient extends WebViewClient { 
    private WebView myView; 
    private HttpAuthHandler httpAuthHandler; 
    private String host; 
    private String realm; 

    @Override 
    public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { 
     AuthRequestDialogFragment authRequestDialogFragment = new AuthRequestDialogFragment(); 
     FragmentManager fragmentManager = ((getActivity()).getSupportFragmentManager()); 
     authRequestDialogFragment.setTargetFragment(WebViewFragment.this, 0); 
     authRequestDialogFragment.show(fragmentManager, "dialog"); 
     this.httpAuthHandler = handler; 
     this.myView = view; 
     this.host = host; 
     this.realm = realm; 
    } 

    public void login(String username, String password) { 
     httpAuthHandler.proceed(username, password); 
     myView = null; 
     httpAuthHandler = null; 
     host = null; 
     realm = null; 
    } 

    public void cancel() { 
     super.onReceivedHttpAuthRequest(myView, httpAuthHandler, host, realm); 
     myView = null; 
     httpAuthHandler = null; 
     host = null; 
     realm = null; 
    } 
} 

использует зависимость:

compile 'com.jakewharton:butterknife:6.0.0' 
+0

В конце концов, самому WebView было недостаточно для моих других целей, и я использовал проект Crosswalk. – EpicPandaForce

1

Если вы не возражаете писать свое имя пользователя и пароль в URL-адресе, вам не нужно менять свой веб-клиент.

Просто откройте следующий URL в WebView:

http://username:[email protected]/userinfo/vid?=1234