如何在Android应用中使用OAuth登录Gmail?

时间:2013-08-13 14:39:06

标签: android gmail oauth-2.0

我正在开发一个使用Login to Gmail的应用程序。我浏览了所有教程,在OAuth 2.0下标记的stackoverflow问题以及google中可用的文档,最后根据官方文档中提供的指南Google OAuth 2.0 sample。我创建了客户端ID以及已安装应用程序所需的所有内容,例如Android。到目前为止,所有内容都运行正常,我致电WebView以授予用户权限,之后我在Accesstoken中获得了4/cR7XXXXXXXXXXXXXXX WebView之类的内容,并说出Please copy this code,switch to your application and paste it here之类的内容1}}。我在这里很困惑,我不知道该怎么做,从Webview回到我的应用程序。在寻找解决方案大约两天但是,我无法得到我的答案问题。这是我被停止的代码。

Main.java,其中用户有OptionMenu登录。当用户点击WebView打开以输入gmail时。

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Main extends Activity {
    public static String REQUEST = "https://accounts.google.com/o/oauth2/auth?"
            + "client_id=XXXXXXXXXXX-gxxxx.apps.googleusercontent.com&"
            + "redirect_uri=urn:ietf:wg:oauth:2.0:oob&"
            + "scope=https://mail.google.com/mail/feed/atom&"
            + "response_type=code&" + "access_type=online";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case 0:
            if (requestCode != RESULT_OK || data == null) {
                return;
            }
            String token = data.getStringExtra("token");
            if (token != null) {

            }
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.item1:
            Intent intent_obj2 = new Intent(Main.this, Webview.class);
            intent_obj2.setData(Uri.parse(REQUEST));
            startActivityForResult(intent_obj2, 0);
            return true;
            }
        return super.onOptionsItemSelected(item);
    }
}

Webview.java

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.Window;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class Webview extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_PROGRESS);
        final WebView wb_obj = new WebView(this);
        setContentView(wb_obj);
        wb_obj.getSettings().setJavaScriptEnabled(true);
        Intent intent = getIntent();
        if (intent.getData() != null) {
            wb_obj.loadUrl(intent.getDataString());
        }

        wb_obj.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                setProgress(newProgress * 10000);
            }

        });
        wb_obj.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                setTitle(url);
                System.out.println(url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                System.out.println("in onPageFinsihed");

                /*CookieSyncManager.getInstance().sync();
                String s_cookie = CookieManager.getInstance().getCookie(url);
                if (s_cookie == null) {
                    System.out.println(s_cookie);
                    return;
                }else{

                String web_title = wb_obj.getTitle().toString();
                System.out.println("web tile" + web_title);

                if (web_title.equalsIgnoreCase("Request for Permission")) {

                } else {

                    String[] s_webtitle = web_title.split("=", 2);
                    String access_token = s_webtitle[1].toString();
                    //System.out.println("Access token" + access_token);
                    startActivity(new Intent(Webview.this, Main.class));
                    finish();
                }*/
                }

        });

    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        startActivity(new Intent(Webview.this, Main.class));
    }
}

根据Webview.java,我调用了finish(),以便当前活动被杀死,但这是在这个应用程序中发生的,所以我将在onAcitivityResult()中获得令牌。请分享您的答案谢谢。

3 个答案:

答案 0 :(得分:2)

以下步骤需要登录Google。

1 - 使用以下代码

从您的设备中选择一个帐户
public static AccountManager accountManager;
accountManager = AccountManager.get(this);
Account[] accounts = accountManager.getAccountsByType("com.google");

2 - 使用以下代码

从所选帐户获取令牌
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);

}

3 - 现在使用用户帐户和令牌验证令牌。您将能够登录谷歌。

注意: 您将从此处Authentication code获取身份验证完整代码,并在需要时将您的Gmail设置为a / c和令牌。现在您可以使用OAuth进行登录。

4 - 重新登录时,您必须使用以下代码

使令牌无效
accountManager.invalidateAuthToken("com.google", token);

5 - 无效后,您必须使用以下代码获取新令牌

 String newToken = AccountManager.get(this).getAuthToken(new Account(account,        "com.google"),
             AUTH_TOKEN_TYPE, true, null, null).getResult().getString(AccountManager.KEY_AUTHTOKEN);
AndroidManifest.xml中的

6 - 以下添加使用权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>

这就是你所需要的,现在享受。

答案 1 :(得分:-1)

考虑使用“localhost:port”作为重定向uri而不是urn:ietf:wg:oauth:2.0:oob&amp; (有关更多详细信息,请参阅https://developers.google.com/youtube/v3/guides/authentication#installed-apps)并将此URL加载到回调中的webview中: public boolean shouldOverrideUrlLoading(WebView视图,String url)。

答案 2 :(得分:-1)

有关使用OAuth2令牌访问Gmail API的替代方法,您可以考虑以下帖子的答案:OAuth and Java (connecting to GMail)