在 Android Java 中使用用户名和密码传递时,如何使用不记名令牌对 api 进行身份验证?
How to authenticate api using bearer token when passed with username and password in Android Java?
我正在使用 Retrofit 库通过 API 向服务器发出 post 请求,发送用户名和密码并获得 session 令牌作为响应。我正在使用此令牌(在 header 中作为承载令牌)向具有纬度和经度的服务器创建 POST 以获取数据,但该方法在 enqueue() 的 onFailure 方法中重复结束.
@POST("api/auth/login/username/{username}/password/{password}")
Call<ResponseBody> login(@Path("username")String username, @Path("password")String password);
@POST("api/products/get")
Call<ResponseBody> getData(@Header("Authorization") String authorization);Call<ResponseBody>
在 MainActivity 中:
Retrofit.Builder builder=new Retrofit.Builder()
.baseUrl("fake url")
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit=builder.build();
DataApi companyApi=retrofit.create(DataApi.class);
private String Token="";tokenCall=comapnyApi.login("data","!fakedata");
tokenCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Wrong Username and password", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake company Server Api", Toast.LENGTH_SHORT).show();
}
});
Call<ResponseBody> Data=companyApi.getData(Token);
Data.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Api Token Expired", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake Company Server", Toast.LENGTH_SHORT).show();
}
});
我认为这是因为您在第一个请求之后立即提出了第二个请求。 enqueue 是异步的,所以当你第一次请求时,我的意思是 tokenCall.enqueue(),它的响应稍后出现,所以第二个 api 调用或 Data.enqueue() 是用 token == "" 调用的.因此,在第一个 api 调用的 onResponse 中进行第二个 api 调用。
private String Token="";
tokenCall=comapnyApi.login("data","!fakedata");
tokenCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
Token = response.body().string();
Call<ResponseBody> Data=companyApi.getData(Token);
Data.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Api Token Expired", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake Company Server", Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Wrong Username and password", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake company Server Api", Toast.LENGTH_SHORT).show();
}
});
我正在使用 Retrofit 库通过 API 向服务器发出 post 请求,发送用户名和密码并获得 session 令牌作为响应。我正在使用此令牌(在 header 中作为承载令牌)向具有纬度和经度的服务器创建 POST 以获取数据,但该方法在 enqueue() 的 onFailure 方法中重复结束.
@POST("api/auth/login/username/{username}/password/{password}")
Call<ResponseBody> login(@Path("username")String username, @Path("password")String password);
@POST("api/products/get")
Call<ResponseBody> getData(@Header("Authorization") String authorization);Call<ResponseBody>
在 MainActivity 中:
Retrofit.Builder builder=new Retrofit.Builder()
.baseUrl("fake url")
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit=builder.build();
DataApi companyApi=retrofit.create(DataApi.class);
private String Token="";tokenCall=comapnyApi.login("data","!fakedata");
tokenCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Wrong Username and password", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake company Server Api", Toast.LENGTH_SHORT).show();
}
});
Call<ResponseBody> Data=companyApi.getData(Token);
Data.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Api Token Expired", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake Company Server", Toast.LENGTH_SHORT).show();
}
});
我认为这是因为您在第一个请求之后立即提出了第二个请求。 enqueue 是异步的,所以当你第一次请求时,我的意思是 tokenCall.enqueue(),它的响应稍后出现,所以第二个 api 调用或 Data.enqueue() 是用 token == "" 调用的.因此,在第一个 api 调用的 onResponse 中进行第二个 api 调用。
private String Token="";
tokenCall=comapnyApi.login("data","!fakedata");
tokenCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
Token = response.body().string();
Call<ResponseBody> Data=companyApi.getData(Token);
Data.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Api Token Expired", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake Company Server", Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Wrong Username and password", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake company Server Api", Toast.LENGTH_SHORT).show();
}
});