¿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):
- Android AccountManager authToken y OAuth
- Android: controla la devolución de llamada de OAuth mediante el filtro de intenciones
- Autenticación contra App Engine desde la aplicación de Android con inicio de sesión federado (OpenID)
- Android: autenticación de Google
- Android y OAUTH 2.0
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<mpl=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<mpl=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!
- Dev Android: la URL de devolución de llamada no funciona ... (0_o)
- Uso de los detalles de autenticación de Dropbox guardados en Android
- Cómo hacer http obtener solicitud en Android
- Autorización de Yahoo OAUTH: oauth_problem = "timestamp_refused"
- Problema con OAuth, Twitter y Android: falla en la comunicación http con el servidor
- Android resto cliente a magento
- ¿Es OAuth en un teléfono móvil usando un servidor proxy demasiado problema?
- Autenticación IMAP / SMTP con el token AccountManager
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!
- Animado (VectorDrawable) animado mediante programación en tiempo de ejecución
- ¿Es el cambio de contexto utilizando un tiempo significativo?