Java 从android发送时,令牌显示已过期
当我从邮递员那里发送信物时,它工作正常。但当我从android应用程序发送相同的令牌时,它显示令牌已过期,但是否新鲜且未过期,并且令牌与邮递员配合良好 我尝试在没有令牌的情况下发送get请求,它工作正常。服务器运行正常。除身份验证外,类正常工作 用于检查令牌的节点js代码:Java 从android发送时,令牌显示已过期,java,android,node.js,jwt,Java,Android,Node.js,Jwt,当我从邮递员那里发送信物时,它工作正常。但当我从android应用程序发送相同的令牌时,它显示令牌已过期,但是否新鲜且未过期,并且令牌与邮递员配合良好 我尝试在没有令牌的情况下发送get请求,它工作正常。服务器运行正常。除身份验证外,类正常工作 用于检查令牌的节点js代码: const jwt = require('jsonwebtoken'); const JWT_KEY = require('../../config').getJwtSecrete(); module.exports =
const jwt = require('jsonwebtoken');
const JWT_KEY = require('../../config').getJwtSecrete();
module.exports = async (req, res, next) => {
try {
let token = req.headers.authorization;
token = getTokenFromHeader(token);
const decoded = jwt.verify(token, JWT_KEY);
req.email = decoded.email;
next();
} catch (error) {
return res.status(401).json({
message: 'Auth failed'
});
}
};
function getTokenFromHeader(token) {
return token.split(" ")[1];
}
Android:我的get请求发送请求的方法
public class GET_Request extends AsyncTask<String, Void, Bundle> {
private static final String REQUEST_METHOD = "GET";
private static final int READ_TIMEOUT = 10000;
private static final int CONNECTION_TIMEOUT = 10000;
private GETAsyncResponse delegate;
public GET_Request(GETAsyncResponse delegate) {
this.delegate = delegate;
}
@Override
protected Bundle doInBackground(String... params) {
String Url = params[0];
Bundle bundle = new Bundle();
String result = null;
BufferedInputStream bufferedInputStream;
ByteArrayOutputStream byteArrayOutputStream;
try {
URL requestUrl = new URL(Url);
HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod(REQUEST_METHOD);
connection.setReadTimeout(READ_TIMEOUT);
connection.setConnectTimeout(CONNECTION_TIMEOUT);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Authorization", "Bearer " + UserInfo.getToken());
connection.connect();
if (connection.getResponseCode() == HTTP_OK) {
bufferedInputStream = new BufferedInputStream(connection.getInputStream());
int bisReadResult = bufferedInputStream.read();
byteArrayOutputStream = new ByteArrayOutputStream();
while (bisReadResult != -1) {
byteArrayOutputStream.write((byte) bisReadResult);
bisReadResult = bufferedInputStream.read();
}
result = byteArrayOutputStream.toString();
} else { //reading error
Log.e("doInBackground: ", String.valueOf(connection.getResponseCode()));
String error;
bufferedInputStream = new BufferedInputStream(connection.getInputStream());
int bisRealError = bufferedInputStream.read();
byteArrayOutputStream = new ByteArrayOutputStream();
while (bisRealError != -1) {
byteArrayOutputStream.write((byte) bisRealError);
bisRealError = bufferedInputStream.read();
}
/*This error string is for debugging*/
error = byteArrayOutputStream.toString();
Log.e("Error Buffer: ", error);
}
bundle.putString(JSON, result);
bundle.putInt(RESPONSE_CODE, connection.getResponseCode());
connection.disconnect();
} catch (FileNotFoundException f) {
f.printStackTrace();
bundle.putInt(RESPONSE_CODE, 400);
}
/*Internet not connected*/ catch (SocketTimeoutException s) {
bundle.putInt(RESPONSE_CODE, 0);
}
/*Any other error*/ catch (IOException e) {
e.printStackTrace();
bundle.putInt(RESPONSE_CODE, 500);
}
return bundle;
}
protected void onPostExecute(Bundle result) {
super.onPostExecute(result);
delegate.AfterGetRequestFinish(result);
}
public interface GETAsyncResponse {
void AfterGetRequestFinish(Bundle bundle);
}
}
我希望它能够成功地进行身份验证。但我不知道为什么它会失败,并显示代码“401”和“java.io.FileNotFoundException”。JWT的一个特性是它们本质上是防篡改的。也就是说,假设您的可疑JWT在Node JS服务器端具有有效的签名和校验和,那么这意味着您的Android Java代码不可能更改该令牌的过期日期
尽管如此,这里最有可能的解释是,您传递的令牌实际上已经过期。出现这种情况的原因有很多,最有可能的原因是您在某个地方缓存了一个旧令牌,可能是在共享首选项中。我马上要说,您的Android端Java代码与JWT的完整性并不相关,因为它基本上不具备篡改和更改过期日期的能力。所以,我的猜测是,要么你正在使用一个过时的令牌,要么你没有使用你认为你是的JWT。嘿,谢谢。对不起,我没抓到你。你能解释一下吗?我是说你的JWT看起来已经过期了,因为你传递的令牌实际上已经过期了。也就是说,你不是在发送你认为是在发送的令牌。哦,天哪!我怎么能这么做!我浪费了3个小时来解决这个问题。你是对的!我尝试注销我的新令牌,它显示了我的旧令牌。所有这些看起来都一样,所以我以前尝试记录它,尽管它是一样的。谢谢你!不,不,我同意。谢谢。通过你的评论解决了这个问题-