的AccountManager身份验证令牌内部消除clientID的和clientSecret(Ac

2019-09-20 18:07发布

你好,我在我的代码的应用程序检索身份验证令牌:

private String updateToken(boolean invalidateToken, int accountref) {
    String authToken = "null";
    try {
        AccountManager am = AccountManager.get(TestAuthActivity.this);
        Account[] accounts = am.getAccountsByType("com.google");
        AccountManagerFuture<Bundle> accountManagerFuture;
        if(TestAuthActivity.this == null){//this is used when calling from an interval thread
            accountManagerFuture = am.getAuthToken(accounts[accountref], SCOPE_CONTACTS_API, false, null, null);
        } else {
            accountManagerFuture = am.getAuthToken(accounts[accountref], SCOPE_CONTACTS_API, null, TestAuthActivity.this, null, null);
        }
        Bundle authTokenBundle = accountManagerFuture.getResult();
        authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString();
        if(invalidateToken) {
            am.invalidateAuthToken("com.google", authToken);
            authToken = updateToken(false, accountref);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    Dialog d = new Dialog(TestAuthActivity.this);
    d.setTitle("Token :" + authToken);
    d.show();


    return authToken;
}

而我呢收到的authToken! (虽然我没有把在clientID的和clientSecret)==> accountManagerFuture = am.getAuthToken(accounts[accountref], SCOPE_CONTACTS_API, null, TestAuthActivity.this, NULL (HERE), null); ,是令牌是否有效?

编辑2012年5月8日:

这是我的新的PHP脚本代码,试图使用令牌来获取用户的ID,但仍然会从谷歌服务器的“无效令牌”:

<?php

if( isset($_POST['authToken'])){        


//curl -H 'Authorization: GoogleLogin auth="Your_ClientLogin_token"' https://www.google.com//m8/feeds/contacts/default/full


    $var = $_POST['authToken'];
    $url = "https://accounts.google.com/o/oauth2/tokeninfo?access_token='".$var."' ";       
    //$url = "https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token='"<?php echo rfc3986_decode($_POST['authToken'])"' ";

    //<?php echo $oauth->rfc3986_decode($accrss_token['oauth_token']) 
    // Initialize session and set URL.
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);

        // Set so curl_exec returns the result instead of outputting it.
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        // Get the response and close the channel.
        $response = curl_exec($ch);
        curl_close($ch);

        echo(json_encode($response));

}
?>

我米获得令牌是与所述相同的Java代码机器人但与这些2行改变:

        if(TestAuthActivity.this == null){//this is used when calling from an interval thread
            accountManagerFuture = am.getAuthToken(accounts[accountref], "oauth2:https://www.googleapis.com/auth/userinfo.email", false, null, null);
        } else {
            accountManagerFuture = am.getAuthToken(accounts[accountref], "oauth2:https://www.googleapis.com/auth/userinfo.email", null, TestAuthActivity.this, null, null);
        }

这里是我要送从我的Android应用程序的令牌我的PHP服务器:

public static void createSession(Context con, String authToken) {

    String result = null;
    InputStream is = null;

    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

    nameValuePairs.add(new BasicNameValuePair("authToken", authToken));

    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://192.168.1.13/loginSession/authActivity4.php");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);

        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {
        Log.i("taghttppost", "" + e.toString());

    }

    // conversion de la réponse en chaine de caractère
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "UTF-8"));

        StringBuilder sb = new StringBuilder();

        String line = null;

        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }

        is.close();

        result = sb.toString();
    } catch (Exception e) {
        Log.i("tagconvertstr", "" + e.toString());
    }
    // recuperation des donnees json
    try {
        Log.i("tagconvertstr", "[" + result + "]");

        JSONObject jObj = new JSONObject(result);

        long userID = jObj.getLong("user_id");

        Dialog d = new Dialog(con);
        d.setTitle(String.valueOf(userID));
        d.show();

    } catch (JSONException e) {
        Log.i("tagjsonexp", "" + e.toString());
    } catch (ParseException e) {
        Log.i("tagjsonpars", "" + e.toString());
    }

}

Answer 1:

我看不出什么毛病的Android代码,获取给您正在使用的令牌类型“令牌oauth2:https://www.googleapis.com/auth/userinfo.email ”当你在以后的更新中提到。

我有一个非常相似的代码测试应用程序,并使用令牌类型时“ oauth2:https://www.googleapis.com/auth/userinfo.email ”我得到一个有效的令牌(运行在手机上的Android 2.3.3),所以它应该工作。

为了确保令牌有效我登录令牌,从日志复制和负载https://accounts.google.com/o/oauth2/tokeninfo?access_token=<token>在Chrome中。 当我这样做,我得到没有任何错误预期的响应。

也许你可以测试相同的缩小是哪里的问题可能是什么?

更新:

这是你得到了最初的令牌是有效的只会工作,只要,到期之后,当您尝试使用它,你会得到一个错误。 我的测试程序停止一段时间后工作时,令牌过期。 当我改变它,我收到后总是令牌无效的它开始再次合作。

出于某种原因,调用am.invalidateAuthToken("com.google", null); 不坏的令牌当令牌类型是“ oauth2:https://www.googleapis.com/auth/userinfo.email ”,所以,当你想以使它无效(如你的代码做),你必须指定令牌。

所以,如果你确保你总是打电话给你updateToken()方法设置为true这应该为你工作的invalidateToken参数。



Answer 2:

此API不采取clientID的或clientSecret作为输入。 该的AccountManager将使用您保存的谷歌凭证在后台调用任何需要的Web API来让你的令牌,或者返回缓存的令牌(如果可用)。 如果返回没有错误令牌,它应该是有效的。 试试看。



文章来源: Accountmanager Auth token whithout clientID and clientSecret