Использование WebView setHttpAuthUsernamePassword?
Я пытаюсь сделать базовую аутентификацию для просмотра защищенного URL. Я хочу получить доступ к защищенному URL-адресу, который выглядит так:
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 здесь?
- Изменение цвета слова в строке ресурса
- Как найти серийный номер Android-устройства?
- findViewById vs Просмотр шаблона владельца в адаптере ListView
- Recyclerview не вызывать onCreateViewHolder
- Ошибка: операция по умолчанию не найдена
Обновление: попытка с завихрением:
curl -u [email protected]:mypassword http://api.test.com/userinfo/user?uid=53461
и он отлично отображает страницу. Я пробовал каждую комбинацию параметра хоста, владельцы api не знают, что я имею в виду под «королевством» (и я тоже), – какую информацию я могу дать им, чтобы помочь этому?
благодаря
- Как создать пользовательский диалог с закругленными углами в android
- Получение проблемы при проверке динамически созданного флажка через просмотр списка
- Удаление fragmentа из заднего стека
- Как проверить видимость программной клавиатуры в Android?
- Как увеличить размер текущего сфокусированного объекта на RecyclerView?
- Остановить метод AsyncTask doInBackground
- ProGuard: невозможно найти ссылочный class com.google.android.gms.R
- Как я могу поддерживать состояние fragmentа при добавлении в задний стек?
Другой вариант – использовать 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"); } }
webview.setWebViewClient(new WebViewClient () { public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { handler.proceed("login", "pass"); } });
Поведение WebView по умолчанию заключается в отбрасывании всех запросов на проверку подлинности. Даже если setHttpAuthUsernamePassword.
Вы должны установить WebViewClient и переопределить метод onReceivedHttpAuthRequest
В этом примере область – By Invitation Only
AuthType Basic AuthName "By Invitation Only" AuthUserFile /usr/local/apache/passwd/passwords Require user rbowen sungo
Если вы не возражаете писать свое имя пользователя и пароль в URL-адресе, то нет необходимости менять клиентский интерфейс.
Просто откройте следующий URL-адрес в веб-просмотре:
http://username:[email protected]/userinfo/vid?=1234
Для второго параметра вам может понадобиться нечто иное, чем ""
. Обратитесь к разработчику веб-сайта и узнайте, какой должна быть соответствующая область. Или используйте инструменты, такие как curl
чтобы узнать, что такое царство.
Я никогда не получал setHttpAuthUsernamePassword для работы с файловым файлом FileTransfer.download (поскольку он не использует веб-просмотр), но я сделал это для работы с телефонной связью. Стоит отметить, что в этом streamе заканчиваются другие пользователи телефонных разговоров.
Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, pass.toCharArray()); } });
Это так глупо. Я взломал что-то вместе, что сработало для меня, я надеюсь, что это сработает и для вас.
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; } }
А также
А также
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'