2016-02-29 9 views
9

मैं एक ऐप पर काम कर रहा हूं जो एक oauth2 प्रमाणीकरण करता है जो काम करता था, लेकिन दुर्भाग्यवश अब और काम नहीं करता है। जहां तक ​​मुझे पता है (लेकिन 100% निश्चित नहीं) कोड पर कुछ भी नहीं बदला है, इसलिए मुझे नहीं पता कि यह अब और क्यों काम नहीं करेगा।मेरे एंड्रॉइड ऐप में ओमेल काम क्यों नहीं करता है?

एप्लिकेशन वेब दृश्य बनाता है और हमारे सर्वर है, जो यह पुनर्निर्देश इस यूआरएल (अभी-अभी बदली ग्राहक आईडी और मेरे डोमेन) पर प्रमाणित करने के लिए गूगल से एक यूआरएल को लोड करता है:

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 

जो तुरंत करने के लिए इसे पुनर्निर्देश:

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 

उसी प्रणाली का उपयोग हमारे आईओएस-ऐप से किया जाता है, जो एक आकर्षण की तरह काम करता है। तो हमारे सर्वर कार्यान्वयन के साथ कुछ भी गलत नहीं है। वेब पर रीडायरेक्ट किए गए वेबव्यू के बाद, यह स्वचालित रूप से किसी भी Google स्क्रीन को दिखाए बिना ऐप पर वापस आ जाता है। मैं वेबव्यू खोलने के लिए निम्नलिखित कोड का उपयोग कर रहा:

@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; 
} 

और logcat उत्पादन इस प्रकार है:

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: [email protected] 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: [email protected] 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 

के बाद से इस लॉग वास्तव में एक त्रुटि नहीं देता, मैं अनिश्चित हूँ क्या गलत हो सकता है।

क्या किसी के पास कोई विचार है कि क्या गलत हो सकता है या मैं इसे कैसे डिबग कर सकता हूं? सभी सुझावों का स्वागत है!

+0

शायद यह मदद करेगा: http://stackoverflow.com/questions/12854468/google-oauth-api-not-working-anymore-404-error – domax

+0

बस एक जंगली अनुमान: ऐसा इसलिए हो सकता है क्योंकि आपने पहुंच की अनुमति दी है याद रखने के लिए और Google आपके डिवाइस पर पंजीकृत Google खाते के आधार पर सफलतापूर्वक प्रमाणित करता है? अपने डिवाइस पर Google खाता हटाने का प्रयास करें, अपने ऐप पर डेटा साफ़ करें और पुनः प्रयास करें। – Codebender

+0

फेसबुक से http://ethbook.github.io/stetho/ से स्टीथो का उपयोग सर्वर और Google के सर्वर के साथ अपने ऐप के बीच संचार की निगरानी के लिए करें .. –

उत्तर

1

आप जिस एपीआई का उपयोग कर रहे हैं उसके कुछ हिस्सों में अपडेट की वजह से आप कोड को बंद कर सकते हैं; मुझे लगता है कि यह OAuth से OAuth2, या संभवतः एक साधारण पैच अद्यतन से अद्यतन हो सकता है। सबसे आसान ठीक अपने 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" /> 

, वहाँ सबसे अधिक संभावना हाथ में एक बड़ा समस्या है।

this post के अनुसार, onCreate() का उपयोग करना गैर-ग्राफिकल प्रारंभिक करने के लिए बेहतर है, क्योंकि इसे onCreateView() से पहले कहा जाता है। आदेश में आप ऐसा जैसे डिवाइस से किसी खाते का चयन करने की आवश्यकता है (अपने Main.java या MainActivity.java में रखते),, गूगल के लिए लॉग इन करने के लिए के रूप में this post में कहा गया है सक्षम होने के लिए:

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

, तो आप प्राप्त करने की आवश्यकता इसलिए जैसे चयनित खाते से टोकन:

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); 
} 

फिर, जब आप टोकन और खाते को प्रमाणित है, तो आप OAuth2 को उपयोग करने के लिए गूगल (प्रमाणीकरण कोड के लिए OAuth2 GitHub Source को देखें) प्रवेश करने में सक्षम हो जाएगा।

आप अभी भी समस्या हो रही है और/या मैं पूरी तरह से अपने प्रश्न का जवाब नहीं दिया, कैसे AccountManager और API कॉल, या कैसे WebView साथ OAuth2 का उपयोग करने पर this साथ OAuth2 का उपयोग करने पर this की जाँच । उत्तरार्द्ध शायद आपकी जरूरतों से अधिक संबंधित है। दोनों आप जो कुछ भी ढूंढ रहे हैं उसे करने के लिए संपूर्ण उदाहरण फाइलें दें।

तो भी आप अभी भी मदद या एक प्रश्न या चिंता है, एक टिप्पणी छोड़ने के लिए स्वतंत्र महसूस की जरूरत है ऊपर दो लिंक को पढ़ने के बाद!

संबंधित मुद्दे