我是编程的新手,我花了10个小时来解决这个问题:我在带有JWT的rails服务器和带有Retrofit的Android应用程序上有一个ruby。我想在Android应用程序中登录并注销,然后使用用户名获得欢迎消息。
我遵循了本教程:https://www.sitepoint.com/retrofit-a-simple-http-client-for-android-and-java/。这是为php服务器,但我试了一下,我可以在rails服务器上访问我的ruby。
到目前为止一切顺利。现在我只需要在我的应用程序中使用此授权令牌,然后我可以使用jwt库解码。但是我不知道怎么收到它。它只出现在logcat中:
com.example.programmingknowledge.login D/Retrofit: {"auth_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJuYW1lIjpudWxsLCJlbWFpbCI6ImV4YW1wbGVAbWFpbC5jb20iLCJleHAiOjE0NzMwMzU1MTF9.bhJABvEgtRISZVJ0DejjEtrGJyXzNV6PO0YGQ71xHRc"}
我需要在我的Android应用程序的某个地方访问此令牌,以便使用jwt库方法进行解码。我怎样才能完全访问此令牌?
这里我向您展示我的代码的一部分: 的操
public class Communicator {
private static final String TAG = "Communicator";
private static final String SERVER_URL = "http://10.0.2.2:3000/authenticate";
public void loginPost(String email, String password){
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(SERVER_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
Interface communicatorInterface = restAdapter.create(Interface.class);
Callback<ServerResponse> callback = new Callback<ServerResponse>() {
@Override
public void success(ServerResponse serverResponse, Response response2) {
if(serverResponse.getResponseCode() == 0){
BusProvider.getInstance().post(produceServerEvent(serverResponse));
}else{
BusProvider.getInstance().post(produceErrorEvent(serverResponse.getResponseCode(), serverResponse.getMessage()));
}
}
@Override
public void failure(RetrofitError error) {
if(error != null ){
Log.e(TAG, error.getMessage());
error.printStackTrace();
}
BusProvider.getInstance().post(produceErrorEvent(-200,error.getMessage()));
}
};
communicatorInterface.postData("login", email, password, callback);
}
public void loginGet(String email, String password){
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(SERVER_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
Interface communicatorInterface = restAdapter.create(Interface.class);
Callback<ServerResponse> callback = new Callback<ServerResponse>() {
@Override
public void success(ServerResponse serverResponse, Response response2) {
if(serverResponse.getResponseCode() == 0){
BusProvider.getInstance().post(produceServerEvent(serverResponse));
}else{
BusProvider.getInstance().post(produceErrorEvent(serverResponse.getResponseCode(), serverResponse.getMessage()));
}
}
@Override
public void failure(RetrofitError error) {
if(error != null ){
Log.e(TAG, error.getMessage());
error.printStackTrace();
}
BusProvider.getInstance().post(produceErrorEvent(-200,error.getMessage()));
}
};
communicatorInterface.getData("login", email, password, callback);
}
@Produce
public ServerEvent produceServerEvent(ServerResponse serverResponse) {
return new ServerEvent(serverResponse);
}
@Produce
public ErrorEvent produceErrorEvent(int errorCode, String errorMsg) {
return new ErrorEvent(errorCode, errorMsg);
}
}
接口
public interface Interface {
//This method is used for "POST"
@FormUrlEncoded
@POST("/")
void postData(@Field("method") String method,
@Field("email") String username,
@Field("password") String password,
Callback<ServerResponse> serverResponseCallback);
//This method is used for "GET"
@GET("/")
void getData(@Query("method") String method,
@Query("email") String username,
@Query("password") String password,
Callback<ServerResponse> serverResponseCallback);
}
MainActivity
public class MainActivity extends AppCompatActivity {
private Communicator communicator;
private String email, password;
private EditText usernameET, passwordET;
private Button loginButtonPost, loginButtonGet;
private TextView information, extraInformation;
private final static String TAG = "MainActivity";
public static Bus bus;
@Override
public void onResume(){
super.onResume();
BusProvider.getInstance().register(this);
}
@Override
public void onPause(){
super.onPause();
BusProvider.getInstance().unregister(this);
}
@Subscribe
public void onServerEvent(ServerEvent serverEvent){
Toast.makeText(this, ""+serverEvent.getServerResponse().getMessage(), Toast.LENGTH_SHORT).show();
if(serverEvent.getServerResponse().getUsername() != null){
information.setText("email: "+serverEvent.getServerResponse().getUsername() + " || Password: "+serverEvent.getServerResponse().getPassword());
}
extraInformation.setText("" + serverEvent.getServerResponse().getMessage());
}
@Subscribe
public void onErrorEvent(ErrorEvent errorEvent){
Toast.makeText(this,""+errorEvent.getErrorMsg(),Toast.LENGTH_SHORT).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
communicator = new Communicator();
usernameET = (EditText)findViewById(R.id.usernameInput);
passwordET = (EditText)findViewById(R.id.passwordInput);
//This is used to hide the password's EditText characters. So we can avoid the different hint font.
passwordET.setTransformationMethod(new PasswordTransformationMethod());
loginButtonPost = (Button)findViewById(R.id.loginButtonPost);
loginButtonPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
email = usernameET.getText().toString();
password = passwordET.getText().toString();
usePost(email, password);
}
});
loginButtonGet = (Button)findViewById(R.id.loginButtonGet);
loginButtonGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
email = usernameET.getText().toString();
password = passwordET.getText().toString();
useGet(email, password);
}
});
information = (TextView)findViewById(R.id.information);
extraInformation = (TextView)findViewById(R.id.extraInformation);
}
private void usePost(String email, String password){
communicator.loginPost(email, password);
}
private void useGet(String email, String password){
communicator.loginGet(email, password);
}
}
ServerResponse (我从教程中复制粘贴,我觉得这个类对我的JWT令牌没用)
public class ServerResponse implements Serializable {
@SerializedName("returned_username")
private String email;
@SerializedName("returned_password")
private String password;
@SerializedName("message")
private String message;
@SerializedName("response_code")
private int responseCode;
public ServerResponse(String email, String password, String message, int responseCode){
this.email = email;
this.password = password;
this.message = message;
this.responseCode = responseCode;
}
public String getUsername() {
return email;
}
public void setUsername(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getResponseCode() {
return responseCode;
}
public void setResponseCode(int responseCode) {
this.responseCode = responseCode;
}
}
这是android控制台的输出。正如您在最后看到的,我检索了一个auth_token:
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: <--- HTTP 200 http://10.0.2.2:3000/authenticate/ (825ms)
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: X-Frame-Options: SAMEORIGIN
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: X-XSS-Protection: 1; mode=block
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: X-Content-Type-Options: nosniff
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: Content-Type: application/json; charset=utf-8
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: ETag: W/"bca211ca110f0be1539cd56c6541e91f"
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: Cache-Control: max-age=0, private, must-revalidate
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: X-Request-Id: beb83594-d0ba-4963-8541-a6a6af50f33f
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: X-Runtime: 0.429996
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: Transfer-Encoding: chunked
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: OkHttp-Selected-Protocol: http/1.1
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: OkHttp-Sent-Millis: 1472969909199
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: OkHttp-Received-Millis: 1472969909678
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: {"auth_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJuYW1lIjpudWxsLCJlbWFpbCI6ImV4YW1wbGVAbWFpbC5jb20iLCJleHAiOjE0NzMwNTY0NDB9.zS2exvYJ1uWlr_LTi0mfCTuJgc3oBU7xNVKsZPMohzY"}
09-04 06:18:29.674 1270-1560/com.example.programmingknowledge.login D/Retrofit: <--- END HTTP (190-byte body)
但是如何才能在我的应用中访问此令牌?我想创建一个String auth_token,我可以在其中临时保存此令牌。然后我想用jwt库解码它,所以我可以获得欢迎消息的用户名