您好我正在使用该代码在我的应用上检索身份验证令牌:
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)
==&GT; accountManagerFuture = am.getAuthToken(accounts[accountref], SCOPE_CONTACTS_API, null, TestAuthActivity.this, NULL (HERE), null);
,该令牌有效吗?
EDIT 5/08/2012:
这是我的新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 android代码,但改变了这两行:
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());
}
}
答案 0 :(得分:3)
如果您使用的令牌类型为“oauth2:https://www.googleapis.com/auth/userinfo.email
”,我在您的Android代码中看不到任何获取令牌的错误,如您在后续更新中所述。
我有一个代码非常相似的测试应用程序,当使用令牌类型“oauth2:https://www.googleapis.com/auth/userinfo.email
”时,我得到一个有效的令牌(在我的手机上运行Android 2.3.3),所以它应该可以工作。
要确保令牌有效,请记录令牌,从日志中复制令牌并在Chrome中加载https://accounts.google.com/o/oauth2/tokeninfo?access_token=<token>
。当我这样做时,我得到了预期的响应而没有任何错误。
也许你可以测试一下以缩小问题所在的范围?
更新
这只有在您获得的初始令牌有效时才有效,在它到期后,当您尝试使用它时会出现错误。我的测试应用程序在令牌过期一段时间后停止工作。当我将其更改为始终使令牌失效后,我再次开始工作。
由于某种原因,当令牌类型为“am.invalidateAuthToken("com.google", null);
”时,调用oauth2:https://www.googleapis.com/auth/userinfo.email
不会使令牌失效,因此您必须在想要使令牌无效时指定令牌(如您的代码所做的那样)。
因此,如果您确保始终使用invalidateToken参数设置为true调用updateToken()方法,则此方法适用于您。
答案 1 :(得分:2)
此API不将clientID或clientSecret作为输入。 AccountManager将使用您保存的Google凭据通过在后台调用任何所需的Web API来获取令牌,或者返回缓存的令牌(如果可用)。如果它返回一个没有错误的标记,它应该是有效的。试试看。