Restapi를 사용하고 Android에서 webview로 로그인할 때 도와주세요. 페이지에서 https://kauth.kakao.com/을 로드할 수 없습니다. 누구든지 수정 사항을 알고 있습니다 .... 감사합니다

restapi를 사용하고 Android에서 webview로 로그인할 때 도와주세요. 페이지에서 https://kauth.kakao.com/을 로드할 수 없습니다. 누구든지 수정 사항을 알고 있습니다 … 감사합니다.

안녕하세요.

Android Webview 설정을 어떻게 하셨을까요?

Kakao Developers - Set up for hybrid app

어떻게 오류가 발생하나요?
구체적인 오류 내용을 말씀주셔야 도움을 드릴수 있을것 같습니다.

1개의 좋아요

나는 문서로 완전히 설정했습니다. 약 1 개월 전에 여전히 로그인 할 수 있었지만 최근에 충돌이 발생하여 Android webview에서 카카오 톡을로드하지 못했습니다.

앱 ID가 어떻게 될까요?
(My Application>App Settings>Summary > ID)

그리고, 어떤 오류가 발생하는지 response 내용을 알려주실수 있나요?

1개의 좋아요

내 앱 ID는 810401입니다.
웹뷰에 표시 및 로드되지 않는 오류가 표시되지 않습니다.

로그를 확인해 보았을 때
카카오톡을 실행시킬 수 있는 JS SDK를 사용하고 있지 않습니다.
REST API 방식을 사용하여 카카오톡 로그인을 구현하고 있는것으로 확인됩니다.

인가코드 요청(/oauth/authorize)이 정상 처리되어 302 디리렉션 응답 하였습니다.
이후, 웹뷰에 표시되지 않는 문제는 서비스측 웹뷰 설정에 문제가 있다고 생각합니다.

그리고 redirect_uri 파라미터 값은 https://hanpode.com/으로 설정되었는데
저는 이 주소 또한 잘못 설정되어 있다고 생각합니다.
이 주소가 인가코드를 전달받아 처리할수 있다고 생각되지 않습니다.

무엇보다 웹뷰가 어떻게 구현했는지 알수 없다면 도움을 드리기 어렵습니다.
재현되는 영상과 웹뷰 설정한 코드를 공유 부탁드립니다.

1개의 좋아요

감사합니다. 코드를 보내드리겠습니다.

package com.uaram.vietnamuserdelivery.module.login.view;

import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.ViewModelProviders;

import com.google.gson.Gson;
import com.uaram.vietnamuserdelivery.R;
import com.uaram.vietnamuserdelivery.base.viewmodel.VMFactory;
import com.uaram.vietnamuserdelivery.common.utils.LogUtils;
import com.uaram.vietnamuserdelivery.common.utils.PreferenceHelper;
import com.uaram.vietnamuserdelivery.common.utils.kakaotalkSignIn.KakaoTalkAuthResponse;
import com.uaram.vietnamuserdelivery.common.utils.kakaotalkSignIn.KakaoTalkAuthUser;
import com.uaram.vietnamuserdelivery.module.login.model.KakaoTalkAccessTokenResponse;
import com.uaram.vietnamuserdelivery.module.login.model.KakaoTalkUserResponse;
import com.uaram.vietnamuserdelivery.module.login.model.UserViewModel;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.inject.Inject;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class KakaoTalkAuthDialog extends DialogFragment {
    @Inject
    VMFactory viewModelFactory;

    private String redirectUrl = "https://hanpode.com/";
    private String requestUrl = "https://kauth.kakao.com/";
    private String requestUrlProfile = "https://kapi.kakao.com/";
    private String clientId = "c4f16d80055e255b730794ac66bd1cd5";
    private String appSecret = "768ee******";
    UserViewModel viewModel;
    String code;
    String id_user;
    private KakaoTalkAuthResponse mListener;

    public KakaoTalkAuthDialog(@NonNull Context context, KakaoTalkAuthResponse mListener) {
        this.requestUrl += "oauth/authorize?client_id=" + clientId + "&redirect_uri=" + redirectUrl + "&response_type=code&scope";
        this.mListener = mListener;
    }

    public VMFactory getViewModelFactory() {
        return viewModelFactory;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.viewModel = ViewModelProviders.of(requireActivity(), getViewModelFactory()).get(UserViewModel.class);
        this.viewModel.accessKakaoTalkResponse.observe(requireActivity(), content -> {
            LogUtils.getInstance().d("XXX =======> " + content);
            KakaoTalkAccessTokenResponse tokenResponse = new Gson().fromJson(content, KakaoTalkAccessTokenResponse.class);
            LogUtils.getInstance().d("XXX =======> " + tokenResponse.token);
            //iewModel.getInstagramUser(tokenResponse.userId, tokenResponse.token);
            //PreferenceHelper.getInstance().saveUserIdToken(tokenResponse.token);
                run(tokenResponse.token);

                Log.d("Ressssssssssssssssssss","CHAYYYYYYYYYYYY");


        });
        this.viewModel.instaUserResponse.observe(requireActivity(), content -> {
            LogUtils.getInstance().d("YYY =======> " + content);
            KakaoTalkUserResponse kakaoTalkUserResponse = new Gson().fromJson(content, KakaoTalkUserResponse.class);
            KakaoTalkAuthUser user = new KakaoTalkAuthUser();
            user.id = kakaoTalkUserResponse.id;
            user.nickname = kakaoTalkUserResponse.nickname;
            mListener.onKakaoTalkAuthSignIn(user);
        });
    }
    public void run(String token)  {

        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url("https://kapi.kakao.com/v2/user/me?access_token="+token)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) {

                String myResponse = null;
                try {
                    myResponse = response.body().string();
                } catch (IOException e) {
                }
                Pattern patternDate = Pattern.compile("\"id\":(.*?),");
                Matcher matcher = patternDate.matcher(myResponse);
                if(matcher.find())
                {
                    id_user= matcher.group(1);
                    Log.d("iddddddddddddddddddd " , matcher.group(1));

                }
                KakaoTalkAuthUser user = new KakaoTalkAuthUser();
                //InstagramUserResponse instagramUserResponse = new Gson().fromJson(content, InstagramUserResponse.class);
                user.id = id_user;
                user.nickname = "" + id_user;
                //user.email = ""+user.email;
                PreferenceHelper.getInstance().saveKakaoId(user.id);
                PreferenceHelper.getInstance().saveKakaoName(user.nickname);
                mListener.onKakaoTalkAuthSignIn(user);
            }
        });
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog_kakao_auth, container);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initializeWebView(view);

    }

    private void initializeWebView(@NonNull View view) {
        WebView webView = view.findViewById(R.id.wvKakao);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.getSettings().setSupportMultipleWindows(true);

        LogUtils.getInstance().d("LINK "+requestUrl);
        webView.loadUrl(requestUrl);
        webView.setWebViewClient(webViewClient);
    }

    WebViewClient webViewClient = new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.startsWith(redirectUrl)) {

                KakaoTalkAuthDialog.this.dismiss();
                return true;
            }
            return false;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            LogUtils.getInstance().d("URL = " + url);
            try {
                String decodedUrl = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8.name());
                LogUtils.getInstance().d("decodedUrl = " + decodedUrl);
                if (decodedUrl.contains("code=")) {
                    Uri uri = Uri.EMPTY.parse(decodedUrl);
//                    String u = uri.getQueryParameter("u");
//                    Uri page = Uri.EMPTY.parse(u);
                     code = uri.getQueryParameter("code");
                    LogUtils.getInstance().e("code " + code);

                    viewModel.getAccessTokenKakaoTalk(clientId, "application/x-www-form-urlencoded", "authorization_code", redirectUrl, code);
//                listener.onTokenReceived(access_token);
                    dismiss();
                } else if (decodedUrl.contains("?error")) {
                    LogUtils.getInstance().e("access_token getting error fetching access token");
                    dismiss();
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    };


}

Android SDK 를 사용하면 카카오 로그인을 좀더 간단히 구현할수 있을것 같습니다.

위의 코드의 경우 Dialog를 사용하셨는데요 이 경우 카카오측 웹 응답에 문제가 있기보다 서비스측의 구현에 문제가 있을것 같습니다. Dialog를 감싸고 있는 Layout 등을 변경하시며 테스트 해보셔야 할것 같습니다.