restapi를 사용하고 Android에서 webview로 로그인할 때 도와주세요. 페이지에서 https://kauth.kakao.com/
을 로드할 수 없습니다. 누구든지 수정 사항을 알고 있습니다 … 감사합니다.
안녕하세요.
Android Webview 설정을 어떻게 하셨을까요?
Kakao Developers - Set up for hybrid app
어떻게 오류가 발생하나요?
구체적인 오류 내용을 말씀주셔야 도움을 드릴수 있을것 같습니다.
나는 문서로 완전히 설정했습니다. 약 1 개월 전에 여전히 로그인 할 수 있었지만 최근에 충돌이 발생하여 Android webview에서 카카오 톡을로드하지 못했습니다.
앱 ID가 어떻게 될까요?
(My Application>App Settings>Summary > ID)
그리고, 어떤 오류가 발생하는지 response 내용을 알려주실수 있나요?
내 앱 ID는 810401입니다.
웹뷰에 표시 및 로드되지 않는 오류가 표시되지 않습니다.
로그를 확인해 보았을 때
카카오톡을 실행시킬 수 있는 JS SDK를 사용하고 있지 않습니다.
REST API 방식을 사용하여 카카오톡 로그인을 구현하고 있는것으로 확인됩니다.
인가코드 요청(/oauth/authorize)이 정상 처리되어 302 디리렉션 응답 하였습니다.
이후, 웹뷰에 표시되지 않는 문제는 서비스측 웹뷰 설정에 문제가 있다고 생각합니다.
그리고 redirect_uri 파라미터 값은 https://hanpode.com/
으로 설정되었는데
저는 이 주소 또한 잘못 설정되어 있다고 생각합니다.
이 주소가 인가코드를 전달받아 처리할수 있다고 생각되지 않습니다.
무엇보다 웹뷰가 어떻게 구현했는지 알수 없다면 도움을 드리기 어렵습니다.
재현되는 영상과 웹뷰 설정한 코드를 공유 부탁드립니다.
감사합니다. 코드를 보내드리겠습니다.
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 등을 변경하시며 테스트 해보셔야 할것 같습니다.