Невозможно получить данные с использованием сгенерированного маркера доступа. каждый раз получил 403 код ошибки
Я могу создать токен доступа и сохранить его. Но я не могу получить данные, используя этот токен доступа. поэтому кто-нибудь может подсказать мне, как установить этот токен доступа в поле заголовка. Я разрабатываю приложение в Android. Все время, когда я запрашиваю конечную точку профиля, она выдает ошибку 403.
Мой код для установки заголовка авторизации выглядит следующим образом: con.setRequestProperty("Авторизация","Носитель"+accesstoken); где con - это объект URLConnection.
А также помимо этого, какие заголовки мне нужно установить для объекта con, чтобы сделать успешный запрос.
Любая помощь будет оценена. Заранее спасибо.
Вот класс для получения данных профиля:
public class ProfileRequestActivity extends Activity {
MyUtility utility=new MyUtility(this);
String urlString="https://platform.lifelog.sonymobile.com/v1/users/me";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.d("pROFILE rEQUESt", "true");
getProfile();
}
public void getProfile()
{
RequestPackage pkg=new RequestPackage();
pkg.setUri(urlString);
pkg.setMethod("GET");
HTTPManager manager=new HTTPManager(pkg);
HttpURLConnection con=manager.doConnection();
Log.d("Access Token",utility.readPrefernce("access_token") );
con.setRequestProperty("Accept-Charset" , "utf-8");
con.setRequestProperty("Authorization", "Bearer "+utility.readPrefernce("access_token"));
con.setRequestProperty("Accept", "application/json");
//con.setDoInput(true);
//con.setDoOutput(true);
con.setRequestProperty("Accept-Encoding", "gzip");
//con.setRequestProperty("Content-Encoding", "gzip");
ExtractProfile task=new ExtractProfile();
task.execute(con);
}
public class ExtractProfile extends AsyncTask<HttpURLConnection, Void, Void>
{
@Override
protected Void doInBackground(HttpURLConnection... params)
{
int responseCode=0;
//String data="";
try {
responseCode = params[0].getResponseCode();
Map<String,List<String>> headerMap=params[0].getHeaderFields();
Log.d("MAP",headerMap.toString());
Log.d("profile response code",""+responseCode);
Log.d("Header:",params[0].getRequestProperty("Authorization"));
//data=params[0].getResponseMessage();
BufferedReader reader;
if (responseCode == HttpURLConnection.HTTP_OK)
reader = new BufferedReader(new InputStreamReader(params[0].getInputStream()));
else
reader = new BufferedReader(new InputStreamReader((params[0].getErrorStream())));
String line;
StringBuilder data=new StringBuilder();
while((line=reader.readLine())!=null)
{
data.append(line);
}
Log.d("data",data.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Log.d("Data",data);
return null;
}
}
}
Here is the helper class:
public class RequestPackage {
String uri="";
String method="GET";
Map<String,String> params=new HashMap<String, String>();
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public Map<String, String> getParams() {
return params;
}
public void setParams(Map<String, String> params) {
this.params = params;
}
public void setParam(String key,String value)
{
params.put(key, value);
}
public String getEncodedParams()
{
StringBuilder sb=new StringBuilder();
for(String key:params.keySet())
{
String value=null;
try {
value = URLEncoder.encode(params.get(key),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
params.put(key, value);
if(sb.length()>0)
{
sb.append("&");
//sb.append(key+"=");
}
sb.append(key+"="+value);
}
return sb.toString();
}
}
public class HTTPManager {
RequestPackage pkg;
public HTTPManager(RequestPackage p)
{
pkg=p;
}
public HttpURLConnection doConnection()
{
URL url;
HttpURLConnection con=null;
BufferedReader reader;
String uri=pkg.getUri();
Log.d("URI",uri);
try {
if(pkg.getMethod().equals("GET"))
{
if(pkg.getParams().size()!=0)
uri+="?"+pkg.getEncodedParams();
}
Log.d("Request Package URI",uri);
url = new URL(uri);
con=(HttpURLConnection) url.openConnection();
con.setRequestMethod(pkg.getMethod());
//con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
if(pkg.getMethod().equals("POST"))
{
con.setDoOutput(true);
con.setDoInput(true);
OutputStreamWriter writer=new OutputStreamWriter(con.getOutputStream());
// Log.d("ENCODED PARAMETER",uri+" "+pkg.getEncodedParams());
writer.write(pkg.getEncodedParams());
writer.flush();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("OUT CON",con.toString());
return con;
}
static public String readData(HttpURLConnection con)
{
// Log.d("IN CON",con.toString());
// String token = con.getHeaderFields();
// return token;
try {
//Log.d("Connection",con.toString());
//Log.d("Response",""+con.getResponseCode());
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb=new StringBuilder();
String line;
while((line=reader.readLine())!=null)
{
sb.append(line);
}
return sb.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
2 ответа
Хорошо, извините за задержку, но я верю, что у меня есть ответ для вас. Кажется, проблема в том, как вы настраиваете свои области действия. Например, у вас есть эта строка:
pkg.setParam("scope", MyOauth.SCOPE_PROFILE+"+"+MyOauth.SCOPE_LOCATION+"+"+MyOauth.SCOPE_ACTIVITY);
Я думаю, что сам по себе это будет найдено, но затем вы также кодируете это перед отправкой на сервер. На данный момент, если вы просто удалите знаки плюс, это должно работать для вас. Как это:
pkg.setParam("scope", MyOauth.SCOPE_PROFILE+" "+MyOauth.SCOPE_LOCATION+" "+MyOauth.SCOPE_ACTIVITY);
Пожалуйста, дайте мне знать, если это не работает для вас!
Хорошо, я потратил некоторое время на просмотр вашего кода сегодня. Кажется, вам не хватает некоторых ключевых вещей для успешного выполнения oauth.
- При взаимодействии с platform.lifelog.sonymobile.com/oauth/2/authorize вам нужно будет открыть что-то вроде диалога. Это даст пользователю возможность согласиться на авторизацию. Похоже, вы просто позвоните по URL, получите ответ и продолжите. Вы должны сначала получить "код" с сервера
- Прежде чем вы сможете начать получать данные, вы должны взять "код" сверху и отправить свой идентификатор клиента и секретный ключ на platform.lifelog.sonymobile.com/oauth/2/token, чтобы получить свой токен. Как только вы получите этот токен, вы можете начать запрашивать данные.
На самом деле это может быть проще, если вы используете библиотеку oAuth, которая заботится о тяжелой работе. Вот то, что я нашел в Интернете, но я уверен, что есть и другие: https://github.com/wuman/android-oauth-client