我正在实现需要身份验证的REST服务。我正在使用JWT。
现在,Android应用程序在登录时发送请求,获取令牌,并且必须在每个后续请求的标头中发送令牌。
我的问题是,如何存储令牌,或者我应该在哪里存储它?
最佳做法的方法是什么?或者我是以完全错误的方式解决这个问题?
答案 0 :(得分:11)
如果您正在使用REST服务并希望存储JWT,则可用的最佳方式是SharedPreferences
。为了安全起见,您应该存储在PrivateMode
中。
SharedPreference
和SharedPreference.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获取令牌
private void getToken() {
prefs=this.getActivity().getSharedPreferences("myPrefs",Context.MODE_PRIVATE);
token = prefs.getString("token","");
}
答案 1 :(得分:10)
我在这里发现了这个(src)
例如,如果您正在编写Android应用,则需要在SharedPreferences
中存储所有访问令牌(这是您需要的API文档才能使其正常工作)。如果您是iOS开发人员,则需要在Keychain
中存储您的访问令牌。