Не удалось получить данные с помощью сгенерированного маркера доступа. каждый раз получаю код ошибки 403

Я могу создать токен доступа и сохранить его. Но я не могу получить данные, используя этот токен доступа. так может ли кто-нибудь предложить мне, как установить этот токен доступа в поле заголовка. Я разрабатываю приложение в Android. Все время, когда я запрашиваю конечную точку профиля, мне выдает ошибку 403.

мой код для установки заголовка авторизации выглядит следующим образом: con.setRequestProperty("Authorization","Bearer"+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;
            }


        }

    }

person Harshal Shah    schedule 19.06.2015    source источник
comment
Из того, что я могу сказать, не должно быть проблем с настройкой вашего запроса таким образом. Можете ли вы предоставить больше кода? Я думаю, это поможет мне лучше понять, что может быть не так.   -  person Robert    schedule 20.06.2015
comment
Спасибо Роберт за вашу помощь. Я отредактировал свой пост, который содержит все связанные коды. Надеюсь, вы можете мне помочь. Я не могу двигаться вперед в своем проекте из-за этой проблемы. Помогите мне, пожалуйста.   -  person Harshal Shah    schedule 23.06.2015
comment
@ Роберт... Привет, Роберт. Я включил свой код. любая помощь будет оценена.   -  person Harshal Shah    schedule 27.06.2015


Ответы (2)


Хорошо, сегодня я потратил некоторое время, чтобы просмотреть ваш код. Кажется, что вам не хватает некоторых ключевых вещей для успешного выполнения oauth.

  1. Вам нужно будет открыть что-то вроде диалогового окна при общении с platform.lifelog.sonymobile.com/oauth/2/authorize. Это даст пользователю возможность согласиться с авторизацией. Похоже, вы просто вызываете URL-адрес, получаете ответ и идете дальше. Вам нужно сначала получить «код» с сервера
  2. Прежде чем вы сможете начать получать данные, вы должны взять «код» сверху и отправить свой идентификатор клиента и секрет на платформу platform.lifelog.sonymobile.com/oauth/2/token, чтобы получить свой токен. Как только вы получите этот токен, вы можете начать запрашивать данные.

На самом деле может быть проще, если вы используете библиотеку oAuth, которая берет на себя всю тяжелую работу. Вот один, который я нашел в Интернете, но я уверен, что есть и другие: https://github.com/wuman/android-oauth-client

person Robert    schedule 02.07.2015
comment
Сэр, приведенный выше код является частью после создания токена доступа. Я делаю все, что вы сказали здесь, чтобы сгенерировать токен доступа. На самом деле я могу создать токен доступа и сохранить его в общих настройках. Но когда впоследствии я делаю запрос профиля для пользователя, я получаю сообщение об ошибке 403. Вышеприведенный код является частью того, как я делаю запрос профиля, используя сгенерированный токен доступа. - person Harshal Shah; 03.07.2015
comment
Я выполняю шаги, как показано на developer.sony.com/develop/services/lifelog- API - person Harshal Shah; 03.07.2015
comment
Извините за задержку с ответом. Таким образом, у вас есть больше кода, который запускает полный oAuth. Из ваших фрагментов я не могу сказать, чего не хватает. Не могли бы вы предоставить мне ваш полный код oAuth для ознакомления, конечно, без ваших фактических учетных данных, чтобы я мог загрузить и скомпилировать его. Тогда, возможно, я смогу помочь выяснить, что не так. - person Robert; 08.07.2015
comment
Вот ссылка, где вы найдете все мои коды:dropbox.com/ s/nzrreqntxnn0h1e/caretaker.docx?dl=0 - person Harshal Shah; 11.07.2015
comment
хорошо, поэтому я начал просматривать ваш код сегодня. Есть ли шанс, что вы можете заархивировать свой код потока oAuth в zip-файл, чтобы я мог подключить идентификатор клиента и секрет и запустить его. Это было бы действительно полезно, потому что на первый взгляд я не вижу, что может быть не так. Вы сказали, что получаете токен, а затем я вижу, что вы отправляете токен с запросом, который выглядит нормально. Можете ли вы заархивировать работающий проект, чтобы я мог его опробовать? - person Robert; 14.07.2015
comment
dropbox.com/s/p6zqd9oz2j1070k/CareTaker.zip?dl=0 Вот ссылка на мой zip-файл. - person Harshal Shah; 15.07.2015
comment
хорошо, я только что взял ваш код, и я пробую его сейчас. Я дам вам знать, как только я что-то найду. - person Robert; 15.07.2015
comment
Пожалуйста, помогите мне как можно скорее, потому что из-за этого я застрял в своем проекте. Спасибо. - person Harshal Shah; 17.07.2015
comment
Большое спасибо, сэр. Я понял. Наконец-то я могу сделать шаг вперед. Большое спасибо. - person Harshal Shah; 18.07.2015

Хорошо, извините за задержку, но я думаю, что у меня есть ответ для вас. Проблема, похоже, в том, как вы настраиваете свои области. Например, у вас есть эта строка:

pkg.setParam("scope", MyOauth.SCOPE_PROFILE+"+"+MyOauth.SCOPE_LOCATION+"+"+MyOauth.SCOPE_ACTIVITY);

Я думаю, что это будет найдено само по себе, но тогда вы также кодируете это перед отправкой на сервер. На данный момент, если вы просто удалите знаки плюса, это должно сработать для вас. Как это:

pkg.setParam("scope", MyOauth.SCOPE_PROFILE+" "+MyOauth.SCOPE_LOCATION+" "+MyOauth.SCOPE_ACTIVITY);

Пожалуйста, дайте мне знать, если это не работает для вас!

person Robert    schedule 16.07.2015