Android Accountmanager身份验证令牌无效
您好,我正在尝试验证我在php服务器上用accountManager创建的令牌,但我在php服务器上的google服务器上不断收到错误“无效令牌”。。。代码如下:Android Accountmanager身份验证令牌无效,android,webserver,accountmanager,auth-token,Android,Webserver,Accountmanager,Auth Token,您好,我正在尝试验证我在php服务器上用accountManager创建的令牌,但我在php服务器上的google服务器上不断收到错误“无效令牌”。。。代码如下: private String updateToken(boolean invalidateToken, int accountref) { String authToken = "null"; try { AccountManager am = AccountManager.get(TestAuthAc
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, false, null, null);
} else {
accountManagerFuture = am.getAuthToken(accounts[accountref], SCOPE, 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();
createSession(TestAuthActivity.this, authToken);
return authToken;
}
private String updateToken(boolean invalidateToken,int accountref){
字符串authToken=“null”;
试一试{
AccountManager am=AccountManager.get(TestAuthActivity.this);
Account[]accounts=am.getAccountsByType(“com.google”);
会计经理未来会计经理未来;
if(TestAuthActivity.this==null){//从间隔线程调用时使用此选项
accountManagerFuture=am.getAuthToken(accounts[accountref],SCOPE,false,null,null);
}否则{
accountManagerFuture=am.getAuthToken(帐户[accountref],作用域,null,TestAuthActivity.this,null,null);
}
Bundle authTokenBundle=accountManagerFuture.getResult();
authToken=authTokenBundle.getString(AccountManager.KEY_authToken.toString();
如果(失效){
am.invalidateAuthToken(“com.google”,authToken);
authToken=updateToken(false,accountref);
}
}捕获(例外e){
e、 printStackTrace();
}
Dialog d=新建对话框(TestAuthActivity.this);
d、 setTitle(“令牌:+authToken”);
d、 show();
createSession(TestAuthActivity.this、authToken);
返回authToken;
}
因此,我得到一个令牌,然后将其发送到我的php服务器:
<?php
if( isset($_POST['authToken'])){
//pour que la réponse s'affiche comme du texte brut
header('Content-Type: text/plain');
/*partie à modifier*/
$name = 'www.google.com';//nom du site
$data = $_POST['authToken'];
$envoi = "POST /m8/feeds/contacts/default/full HTTP/1.1\r\n";
$envoi .= "Host: ".$name."\r\n";
$envoi .= "Authorization: GoogleLogin auth='".$data."'\r\n";
$envoi .= "Connection: Close\r\n";
$envoi .= "Content-type: application/x-www-form-urlencoded\r\n";
$envoi .= "Content-Length: ".strlen($data)."\r\n\r\n";
$envoi .= $data."\r\n";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket < 0){
die('FATAL ERROR: socket_create() : " '.socket_strerror($socket).' "');
}
if (socket_connect($socket,gethostbyname($name),80) < 0){
die('FATAL ERROR: socket_connect()');
}
if(($int = socket_write($socket, $envoi, strlen($envoi))) === false){
die('FATAL ERROR: socket_write() failed, '.$int.' characters written');
}
$reception = '';
while($buff = socket_read($socket, 2000)){
$reception.=$buff;
}
echo(json_encode($reception));
socket_close($socket);
}
?>
我可以想到您可能遇到的两个问题:
身份验证令牌已过期。调用方法updateToken()
获取令牌时,需要将参数invalidateToken
设置为true,以确保获取新令牌
范围的值是错误的。根据您提供的代码,您似乎正在尝试使用Google Contacts API,因为此APISCOPE
应该具有值https://www.google.com/m8/feeds