【问题标题】:Retrofit authentication in the next activity在下一个活动中改造身份验证
【发布时间】:2018-07-11 04:40:35
【问题描述】:

我的第一个活动是为此目的使用最简单的形式和硬编码凭据的登录活动。 POST 请求被发送到 API 并作为结果返回令牌。一切正常。现在我实现它的方式是我在登录方法内的 onClick 事件中的 onSuccess 方法内放置了一个意图。代码如下:

Login login = new Login("{hardcodedEmail}", "{hardcodedPassword}");
Call<User> call = userClient.login(login);
call.enqueue(new Callback<User>() {
    @Override
    public void onResponse(Call<User> call, Response<User> response) {
        Toast.makeText(MainActivity.this, response.body().getToken(), Toast.LENGTH_LONG).show();
        String token = response.body().getToken();
        Intent i = new Intent(MainActivity.this, TestActivity.class);
        startActivity(i);
   }

   @Override
   public void onFailure(Call<User> call, Throwable t) {
       Toast.makeText(MainActivity.this, "Error: \n" + t.getMessage(), Toast.LENGTH_LONG).show();
   }
});

这段代码有一个简单的祝酒词,向我展示令牌并说一切正常。这样做,我在此页面上没有任何错误。但在下一页上,我试图从 API 检索一些数据并显示它,但我收到错误 401,或未经授权的访问。这意味着我的凭据没有保留。

除了直接跳到下一个活动以保持凭据有效之外,我还需要做些什么吗?

【问题讨论】:

    标签: android retrofit http-token-authentication


    【解决方案1】:

    您可以将token string 通过Intent 从您的MainActivity 传递到TestActivity。随意尝试:

    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            .....
    
            String token = response.body().getToken();
            Intent i = new Intent(MainActivity.this, TestActivity.class);
    
            // pass token string through Intent
            i.putExtra("TOKEN_STRING", token);
    
            startActivity(i);
       }
    

    然后在TestActivity,从Intent获取token传入:

    // declare token as member variable
    private String token;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        .....
    
        Intent intent = getIntent();
        this.token = intent.getStringExtra("TOKEN_STRING");
    
        // you can do whatever you want with token later
        // eg: use token for authentication when issue next network call
    
        ....
    }
    

    【讨论】:

    • 感谢您的回答。当我获得令牌时,我应该将它传递到哪里才能进行身份验证?抱歉,我还在学习 Retrofit。
    • 您必须检查您正在使用的 API 文档。我的猜测是,首先你发出登录调用来获取令牌,这就是你在userClient.login(login); 中所做的。然后每当您发出authenticated API calls 时,可能需要通过某种方式传递令牌,例如:将其设置为HTTP 标头等。基于此,服务器能够区分真正的logged-in 用户和匿名用户。因此,请查看您的 API 文档。
    • 谢谢,我会检查并报告。
    • 顺便说一句,如果您觉得我的回答有帮助,您介意点赞还是接受作为答案?谢谢。
    • 我没有足够的代表来支持你,但我将你的答案标记为解决方案。再次感谢。顺便说一句,所需要的只是将令牌作为授权标头传递给客户端。
    猜你喜欢
    • 2021-04-20
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多