Webview에서 rest api 호출 시 문제

문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.


안녕하세요.
ID 1095370
개발환경: 안드로이드 webview

안드로이드앱에서 webview를 띄우고, rest api를 통해 카카오 인증 시도시,
webiew에서 화면이 전혀 나오지 않고, 계속 아래의 페이지들을 호출합니다.

onPageFinished: 카카오계정
onPageFinished: 카카오계정
onPageFinished: 카카오계정
onPageFinished: 카카오계정

호출한 인증 url은 다음과 같습니다.
카카오계정<#######>&redirect_uri=<>
호출을 한번만 해도 계속, onpagefinished가 여러번 호출됩니다.

관련해서, 참고할만한 자료나 해결방안 알려주시면 감사하겠습니다.

참고로 코드는 다음과 같습니다.

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {

    super.onViewCreated(view, savedInstanceState);

  //kakao
    //
    FrameLayout webViewLayout;

    WebView webView = view.findViewById(R.id.webView);
    webViewLayout = view.findViewById(R.id.webview_frame);


    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setSupportMultipleWindows(true);



    webView.setWebChromeClient(new WebChromeClient() {

        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            WebView childWebView = new WebView(view.getContext());
            Log.d("TAG", "Creating new WebView");

            childWebView.getSettings().setJavaScriptEnabled(true);
            childWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            childWebView.getSettings().setSupportMultipleWindows(true);

            childWebView.setLayoutParams(view.getLayoutParams());
            childWebView.setWebViewClient(view.getWebViewClient());
            childWebView.setWebChromeClient(view.getWebChromeClient());

            webViewLayout.addView(childWebView);

            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(childWebView);
            resultMsg.sendToTarget();

            return true;
        }
        @Override
        public void onCloseWindow(WebView window) {
            super.onCloseWindow(window);
            webViewLayout.removeView(window);
        }
    });


    webView.setWebViewClient(new WebViewClient() {


      @Override
        public void onPageFinished(WebView view, String url) {

          super.onPageFinished(view, url);
          Log.d(TAG, "onPageFinished: " + url);
          if (url.startsWith(REDIRECT_URI)) {
              Uri uri = Uri.parse(url);
              String code = uri.getQueryParameter("code");
              if (code != null) {
                  Log.d(TAG, "Authorization code: " + code);
                  // Exchange authorization code for access token
                  exchangeCodeForToken(code);
              } else if (uri.getQueryParameter("error") != null) {
                  Log.e(TAG, "Error: " + uri.getQueryParameter("error"));
              }
          }
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            Log.d("TAG url", request.getUrl().toString());
            Log.d("TAG scheme", request.getUrl().getScheme());

            if ("https".equals(request.getUrl().getScheme())) {
                Log.d("SJCHOI4", "SJCHOI: " + request.getUrl().toString());
                webView.loadUrl(request.getUrl().toString());
            }

            if ("intent".equals(request.getUrl().getScheme())) {
                try {
                    Intent intent = Intent.parseUri(request.getUrl().toString(), Intent.URI_INTENT_SCHEME);

/*
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
Log.d(“TAG”, "ACTIVITY: " + intent.getPackage());
return true;
}
*/
String fallbackUrl = intent.getStringExtra(“browser_fallback_url”);
if (fallbackUrl != null) {
view.loadUrl(fallbackUrl);
Log.d(“TAG FALLBACK”, "FALLBACK: " + fallbackUrl);
Log.d(“SJCHOI5”, "SJCHOI: " + fallbackUrl);
return true;
}

                    Log.e("TAG", "Could not parse anything");

                } catch (URISyntaxException e) {
                    Log.e("TAG", "Invalid intent request", e);
                }
            }

            return false;
        }
    });
    String authUrl = AUTH_URL + "?response_type=code"
          + "&client_id=" + CLIENT_ID
          + "&redirect_uri=" + REDIRECT_URI;

    webView.loadUrl(authUrl);

}

안녕하세요.

호출을 한번만 해도 계속, onpagefinished가 여러번 호출됩니다.
String authUrl = AUTH_URL + "?response_type=code"
          + "&client_id=" + CLIENT_ID
          + "&redirect_uri=" + REDIRECT_URI;

    webView.loadUrl(authUrl);

인가코드 요청은 카카오 계정로그인을 위한 내부 리다이렉트가 있으며 로그인 후 다시 kauth로 돌아가는 것은 정상동작입니다.
웹뷰가 아닌 테스트하신 기기 브라우저에서 정상동작하는 카카오 로그인 구현 후, 웹뷰에서 정상동작하는지 확인해주세요.

안녕하세요. 답변 감사합니다.
만약 그렇다면, 왜 한번 호출에 여러번의 onpagefinished가 호출되는지요?

어떤 상황인지 확인 위해 개발하신 로그인 페이지 URL 기재해주시겠어요?


계정로그인을 위한 내부 리다이렉트가 있으며

리다이렉트 될때마다 onpagefinished 호출되겠지요?

https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=0b4cc89a2638a0b9dfbf226a3fbd1a9a&redirect_uri=https://gpschoi.tistory.com

입니다. 감사합니다.

리다이렉트 URI가 redirect_uri=https://gpschoi.tistory.com 인가요?

이렇게 처리하시면 onpagefinished와 무관하게 카카오 로그인이 안될텐데요?

어떤 용도로 카카오 로그인 사용하시는건가요?

네 tistory blog 작성을 위해 카카오 계정 로그인을 하려고 합니다.

"tistory blog 작성을 위해 카카오 계정 로그인"은 디벨로퍼스에서 제공하는 카카오 로그인으로 할 수 없습니다.

tistory로그인은 tistory에서 제공하므로 타인이 처리 할 수 없습니다.

잘 이해했습니다. 알려주셔서 감사합니다.
마지막으로, webview를 이용하여 tistory에서 로그인시 카카오계정 로그인 화면이 떴을 때,
javascript등을 이용하여 로그인은 가능할지요?

아쉽지만, 이용자의 액션없이 카카오계정 ID/PW 입력 자동 처리 기능은 제공하지 않습니다.

카카오 계정에서 제공하는 ‘간편로그인 정보 저장’ 기능을 활용하시면 좋을 것 같습니다.

image

넵 답변 주셔서 감사합니다.!

1개의 좋아요