无法使用生成的accesstoken检索数据。每次都有403错误代码

时间:2015-06-19 01:30:52

标签: sony sony-lifelog-api

我能够生成访问令牌并存储它。但我无法使用此访问令牌获取数据。所以任何人都可以建议我如何在标题字段中设置此访问令牌。我在android中开发应用程序。所有当我请求配置文件端点时,它给我403错误。

我设置授权标头的代码如下:  con.setRequestProperty(“授权”,“承载”+ accessstoken); 其中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 个答案:

答案 0 :(得分:0)

好的我今天花了一些时间来查看你的代码。看来你有一些关键的东西不能成功地做oauth。

  1. 在与platform.lifelog.sonymobile.com/oauth/2/authorize进行通信时,您需要弹出类似对话框的内容。这将使用户有机会同意授权。看起来你只是打电话给网址做出回应并继续前进。您需要先从服务器获取“代码”
  2. 在您开始接收数据之前,您必须从上面获取“代码”并将您的客户端ID和密码发送到platform.lifelog.sonymobile.com/oauth/2/token以获取您的令牌。获得该令牌后,您就可以开始查询数据了。
  3. 如果您使用oAuth库来处理艰苦的工作,实际上可能会更容易。这是我在网上找到的,但我相信还有其他人: https://github.com/wuman/android-oauth-client

答案 1 :(得分:0)

很抱歉延迟,但我相信我有一个答案。问题似乎在于您如何设置示波器。例如,你有这一行:

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

我认为它本身就可以找到,但是在将它发送到服务器之前你也会编码。现在,如果你只是删除加号,它应该适合你。像这样:

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

如果这不适合你,请告诉我!