我应该如何在 android 中使用 JWT?

Posted

技术标签:

【中文标题】我应该如何在 android 中使用 JWT?【英文标题】:how should i use JWT in android? 【发布时间】:2020-07-21 21:01:40 【问题描述】:

我想使用jjwt 创建登录活动。 所以我不知道如何使用它。我在https://github.com/jwtk/jjwt 上读过它,但我听不懂,因为我的英语不流利。我想让你给我一个例子来理解它。我应该送任何东西去服务吗?或者我应该用 sqlite openhelper 将密钥保存在我的 DatabaseHelper 中。 我使用OkHttp 将用户名和密码发送到服务并使用json 获取它。 这是我的活动:

主活动:

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    
    public void btnSignin_Clicked(View view)
        String username=((EditText)findViewById(R.id.txtUsername)).getText().toString();
        String password=((EditText)findViewById(R.id.txtPassword)).getText().toString();
        new SigninTask().execute(username,password);
    
    public void btnSignup_Clicked(View view)
        ((EditText)findViewById(R.id.txtUsername)).setText("");
        ((EditText)findViewById(R.id.txtPassword)).setText("");
        String username=((EditText)findViewById(R.id.txtUsername)).getText().toString();
        String password=((EditText)findViewById(R.id.txtPassword)).getText().toString();
        new SignupTask().execute(username,password);
    

    private class SignupTask extends AsyncTask<String,Object,String>
        @Override
        protected String doInBackground(String... strings) 

            try 
                return
                new OkHttpClient()
                        .newCall(
                                new Request.Builder()
                                .url("http://localhost:8080/Service/signup?username="+strings[0]+"&password="+strings[1])
                                .build()
                        )
                        .execute()
                        .body()
                        .string();
            catch (Exception e)
                return null;
            

        

        @Override
        protected void onPostExecute(String s) 
            SimpleDialog dialog=new SimpleDialog();
            dialog.setContext(MainActivity.this);
            dialog.setTitle("Error");
          try 
              JSONObject jsonObject=new JSONObject(s);
              Boolean result=jsonObject.getBoolean("value");
              if (result)
                  String username= ((EditText)findViewById(R.id.txtUsername)).getText().toString();
                  dialog.setMessage("Signup completed)");
                  ((EditText)findViewById(R.id.txtUsername)).setText("");
                  ((EditText)findViewById(R.id.txtPassword)).setText("");

              else 
                  ((EditText)findViewById(R.id.txtUsername)).setText("");
                  ((EditText)findViewById(R.id.txtPassword)).setText("");
                  dialog.setMessage("Sign up failed !");
              
          catch (Exception e)
              dialog.setMessage("Error occured !");
          
          dialog.show(getSupportFragmentManager(),"dialog");
        
    

    private class SigninTask extends AsyncTask<String,Object,String>
        @Override
        protected String doInBackground(String... strings) 
            try 
              return   new OkHttpClient()
                        .newCall(
                                new Request.Builder()
                                        .url("http://localhost:8080/Service/authorize?username="+strings[0]+"&password="+strings[1])
                                        .build()
                        )
                        .execute()
                        .body()
                        .string();
            catch (Exception e)
                return null;
            
        

        @Override
        protected void onPostExecute(String s) 
            SimpleDialog dialog=new SimpleDialog();
            dialog.setContext(MainActivity.this);
            dialog.setTitle("Error");
            try 
                JSONObject jsonObject=new JSONObject(s);
                Boolean result=jsonObject.getBoolean("value");
                if (result)
                    String username=((EditText)findViewById(R.id.txtUsername)).getText().toString();
                    String password=((EditText)findViewById(R.id.txtPassword)).getText().toString();
                    Intent intent=new Intent(MainActivity.this,CategoryActivity.class);
                    User user=new User();
                    user.setUsername(username);
                    user.setPassword(password);

                    intent.putExtra("user",user);
                    startActivity(intent);
                    finish();
                else 
                    dialog.setMessage("Invalid username or password !");
                
            catch (Exception e)
                dialog.setMessage("Error occured !");
            
            dialog.show(getSupportFragmentManager(),"dialog");
        
    

【问题讨论】:

【参考方案1】:

通常,您将登录数据(用户名、密码)发送到对您进行身份验证的服务器,然后该服务器发回 JWT。您可以将此令牌存储在您的应用程序中。然后在每个请求中将此令牌发送到服务器以对您进行身份验证。

【讨论】:

你告诉服务器发回一个 JWT 。但在 github (jjwt) 中适用于 android studio?我使用 netbeans ide 制作服务器。我应该在 netbeans 或 android studio 中使用 JWT。 @TymurPysarevych @Mohammad,客户端(应用程序)将凭据发送到对客户端进行身份验证的服务器。成功验证后,您会在客户端收到 JWT。然后,您只需在每个请求中的 HTTP 标头中发送此令牌,您就可以开始了。

以上是关于我应该如何在 android 中使用 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring security 和 JwtBuilder 中处理 JWT 过期(我应该使用 cookie max age)

使用 jwt 令牌时如何发送用户信息?

我应该/如何将我的 JWT 令牌存储在 redis 中以便我可以看到当前的用户会话?

如何在 JWT 令牌中包含声明?

我应该如何在 axios GET 请求中发送 JWT 令牌? [复制]

存储JWT令牌的位置?