在哪里存储 JWT 令牌?

Posted

技术标签:

【中文标题】在哪里存储 JWT 令牌?【英文标题】:Where to store a JWT token? 【发布时间】:2016-03-15 11:43:56 【问题描述】:

我正在实现一个需要身份验证的 REST 服务。我正在使用JWT。

现在 android App 在登录时发送请求,获取令牌,并且必须在每个后续请求的标头中发送令牌。

我的问题是,如何存储令牌,或者我应该将它存储在哪里?

共享首选项 SQLite 数据库 在文件中

最佳实践方法是什么?还是我的做法完全错误?

【问题讨论】:

你找到答案了吗? 不。我只是将它存储在共享首选项中。 reddit (reddit.com/r/androiddev/comments/470h8a/…) 对此进行了很好的讨论 【参考方案1】:

如果您使用 REST 服务并希望存储 JWT,可用的最佳方式是 SharedPreferences。出于安全考虑,您应该存储在 PrivateModeSharedPreferenceSharedPreference.Editor 用于存储和检索 JWT .在用户名和密码的 POST 请求后检索 JWT

 private void makeJsonRequest()     
        String json_req = "json_req";
       // String url = getContext().getString(R.string.LOGIN_URL);
            String url="";    
            final JSONObject obj=new JSONObject();
            try
                obj.put("username",name);
                obj.put("password",pass);

            catch (JSONException e)
            
                e.printStackTrace();
            

        JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, obj,
                new Response.Listener<JSONObject>() 
                    @Override
                    public void onResponse(JSONObject response)                           
                    
                ,
                new Response.ErrorListener() 
                    @Override
                    public void onErrorResponse(VolleyError error)                 
                    

                )           
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError 
                Map<String, String> headers = new HashMap<>();
                return headers;
            
        ;
        AppController.getInstance().addToRequestQueue(req, json_req);  

要从响应中检索 JWT 并保存在共享首选项中使用

SharedPreferences prefs;
    SharedPreferences.Editor edit;
 prefs=getActivity().getSharedPreferences("myPrefs",Context.MODE_PRIVATE);
        edit=prefs.edit();
 try 
                         String saveToken=response.getString("token");
                            edit.putString("token",saveToken);
                            Log.i("Login",saveToken);
                              edit.commit();
                        
                        catch (JSONException e)
                        
                            e.printStackTrace();
                          

从 SharedPreference 中获取 Token

private void getToken() 
        prefs=this.getActivity().getSharedPreferences("myPrefs",Context.MODE_PRIVATE);
        String token = prefs.getString("token","");
    

【讨论】:

这不仅为我回答了同样的问题,我希望前几天我在弄清楚如何将 JSON POST 请求发送到 REST API 时能找到它。好东西。【参考方案2】:

我在这里找到了这个答案 (src)

例如,如果您正在编写一个 Android 应用程序,您需要将所有访问令牌存储在 SharedPreferences 中(这里是您需要使其工作的 API 文档)。如果您是 ios 开发人员,您会希望将访问令牌存储在 Keychain 中。

for ios

for android

【讨论】:

root 设备怎么样?特别是安卓?还安全吗?

以上是关于在哪里存储 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里可以将 jwt 令牌存储在 localStorage 中?

在 Django REST 框架中使用 JWT 时,刷新令牌和访问令牌存储在哪里?

jwt访问令牌存储在spring boot中的哪里?

我们可以在哪里安全地存储 JWT 令牌?

在哪里存储访问令牌以及如何跟踪用户(在 Http only cookie 中使用 JWT 令牌)

在哪里存储 JWT 令牌 Laravel 5.6 应用程序?