Retrofit和JWT,我只需要这个令牌

时间:2016-09-04 06:50:28

标签: android retrofit jwt

我是编程的新手,我花了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库解码它,所以我可以获得欢迎消息的用户名

0 个答案:

没有答案