¿Por qué no funciona gmail oauth en mi aplicación para Android?

Estoy trabajando en una aplicación que hace una autenticación oauth2 que solía funcionar, pero desafortunadamente no funciona más. Por lo que sé (pero no 100% seguro) nada cambió en el código, así que no sé por qué no funcionaría más.

La aplicación crea una vista web y carga una url de nuestro servidor, que la redirecciona a google para que se autentique en esta url (solo cambió la identificación del cliente y mi dominio):

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=1234567890-XXXXXXX.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Fexample.com%3A5000%2Fchannel%2Fgmail%2Fcallback&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly&access_type=offline 

Que lo redirecciona inmediatamente a:

 https://accounts.google.com/ServiceLogin?passive=1209600&continue=https://accounts.google.com/o/oauth2/auth?access_type%3Doffline%26scope%3Dhttps://www.googleapis.com/auth/userinfo.email%2Bhttps://www.googleapis.com/auth/gmail.readonly%26response_type%3Dcode%26redirect_uri%3Dhttp://example.com:5000/channel/gmail/callback%26client_id%3D123456789-XXXXX.apps.googleusercontent.com%26hl%3Dnl%26from_login%3D1%26as%3D-2178738b5063e716&ltmpl=popup&oauth=1&sarp=1&scc=1 

El mismo sistema se utiliza desde nuestra iOS-app, que funciona como un encanto. Así que no hay nada malo en nuestra implementación de servidor. Después de que la webview sea redirigida a google, automáticamente regresa a la aplicación sin mostrar ninguna pantalla de google. Estoy utilizando el siguiente código para abrir la vista web:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_browser_webview, container, false); webView = (WebView) view.findViewById(R.id.web_view); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setDisplayZoomControls(false); webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setDomStorageEnabled(true); webView.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.wtf("ERROR", description + " " + failingUrl); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.wtf("WEBVIEW URL", url); if (url.contains(Api.API_ENTER_POINT)) { // We never actually get here getActivity().finish(); } return false; //Allow WebView to load url } }); if (userId != null & userToken != null) { Log.d("Gmail login", String.format(Api.API_GMAIL,userId,userToken)); webView.loadUrl(String.format(Api.API_GMAIL,userId,userToken)); } return view; } 

Y la salida logcat es la siguiente:

 02-29 18:56:39.028 27510-27510/com.example D/Gmail login: http://example.com:5000/api/v1/channel/gmail/on/1/CAAV8cDYVv9wBAKDfKu7zjInpUbSxBjSiouG8iFtP2EGKjb63AOAjirFf9SepSwe62PsNt0pflwZBKs8xvoH2Y7cnOsHTC33ikbwLFgwiqmK7AtHYzo2BTZAmiDGQvCKZBSdjIR5o5zvgqSZAFiGEU10PVTnXw2fRJzukQ0VEVoZC9VrO7el8hjeg2VoVBFhb9ppPCsHYkPKRWgThKJ76VJS4K3m2X7LwZD 02-29 18:56:39.092 27510-27510/com.example D/cr_Ime: [ImeAdapter.java:358] onViewFocusChanged: gainFocus [true] 02-29 18:56:39.119 27510-27510/com.example D/cr_Ime: [ImeAdapter.java:140] onCreateInputConnection returns null. 02-29 18:56:39.162 27510-27510/com.example I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@2b109b89 time:227199315 02-29 18:56:39.163 27510-27510/com.example A/WEBVIEW URL: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=1234567890-XXXXXXXXXX.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Fexample.com%3A5000%2Fchannel%2Fgmail%2Fcallback&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly&access_type=offline 02-29 18:56:39.216 27510-27510/com.example A/WEBVIEW URL: https://accounts.google.com/ServiceLogin?passive=1209600&continue=https://accounts.google.com/o/oauth2/auth?access_type%3Doffline%26scope%3Dhttps://www.googleapis.com/auth/userinfo.email%2Bhttps://www.googleapis.com/auth/gmail.readonly%26response_type%3Dcode%26redirect_uri%3Dhttp://example.com:5000/channel/gmail/callback%26client_id%3D1234567890-XXXXXXXXXX.apps.googleusercontent.com%26hl%3Dnl%26from_login%3D1%26as%3D-231b0767e02a8ca9&ltmpl=popup&oauth=1&sarp=1&scc=1 02-29 18:56:39.283 27510-27510/com.example I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@16bf8d10 time:227199436 02-29 18:56:39.287 27510-27510/com.example D/cr_Ime: [ImeAdapter.java:358] onViewFocusChanged: gainFocus [false] 02-29 18:56:39.287 27510-27510/com.example D/cr_Ime: [ImeAdapter.java:326] hideKeyboard 02-29 18:56:39.288 27510-27510/com.example D/cr_Ime: [InputMethodManagerWrapper.java:56] isActive: false 

Dado que este registro no da realmente un error, no estoy seguro de lo que podría estar mal.

¿Alguien tiene alguna idea de lo que podría ser posible mal o cómo puedo depurar esto? Todos los consejos son bienvenidos!

Probablemente ha dejado de funcionar debido a una actualización en alguna parte de la API que está utilizando; Supongo que podría estar actualizando de OAuth a OAuth2, o posiblemente una actualización de parches simple. La solución más fácil sería agregar permisos y metadatos a su AndroidManifest.xml :

 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.USE_CREDENTIALS"/> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 

Si eso no lo arregla , es más probable que un problema más grande a la mano.

Según este post , es mejor usar onCreate() para realizar cualquier inicialización no gráfica, ya que se llama antes onCreateView() . Para poder acceder a google, como se indica en este post , primero debes seleccionar una cuenta desde el dispositivo como así (ponla en tu Main.java o MainActivity.java ):

 public static AccountManager accountManager; accountManager = AccountManager.get(this); Account[] accounts = accountManager.getAccountsByType("com.google"); 

A continuación, debe obtener el token de la cuenta seleccionada de la siguiente manera:

 private void onAccountSelected(final Account account) { accountManager.getAuthToken(account, AUTH_TOKEN_TYPE, null, this, new AccountManagerCallback<Bundle>() { public void run(AccountManagerFuture<Bundle> future) { try { String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN); useToken(account, token); } catch (OperationCanceledException e) { onAccessDenied(); } catch (Exception e) { handleException(e); } } }, null); } 

Una vez que haya autenticado el token y la cuenta, podrá iniciar sesión en google con OAuth2 (consulte el origen OAuth2 GitHub para el código de autenticación).

Si sigue teniendo problemas y / o no he respondido completamente a su pregunta , echa un vistazo a esto sobre cómo usar OAuth2 con AccountManager y las llamadas API, o esto sobre cómo usar OAuth2 con WebView . Este último probablemente pertenece más a sus necesidades. Ambos dan ejemplos completos de archivos sobre cómo hacer lo que estás buscando.

Si incluso después de leer los dos enlaces anteriores todavía necesita ayuda o tiene una pregunta o preocupación, no dude en dejar un comentario!

  • LinkedIn scribe OAuth biblioteca no puede permitir el acceso a la cuenta de LinkedIn
  • Autenticar usuario registrado con FB en mi servidor usando el Administrador de cuentas de Android
  • Inicia sesión de Google en la aplicación de Android para consumir Cloud Endpoints backend
  • Android y Twitter4j: ¿Manejando OAuth con un widget de Webview?
  • Estado de la instancia OAuth en Android
  • Cómo establecer encabezados HttpPost para una solicitud de cliente en Java Android
  • Android Oauth Exception con el transporte SMTP se conectan, con Android versión 2.3
  • Cómo configurar el encabezado de autorización (OAuth token) en una solicitud Android OKHTTPClient
  • Oauth de dos patas en Android
  • Com.google.android.gms.auth.GoogleAuthException: Desconocido
  • GoogleAuthUtil.getToken () devuelve un token no válido ("kid" no se encuentra en la lista de claves públicas y "exp" es dom 18 de enero de 1970)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.