Search code examples
microsoft-band

Can't access MS cloud api


I want to access MS cloud api on android flatform.

So I found one sample app.

Here is sample app which work this function. (https://github.com/adithya321/Companion-for-Band/blob/dev/app/src/main/java/com/pimp/companionforband/activities/cloud/WebviewActivity.java)

I made MS application from dev.app.microsoft.com

and made password and register web platform rediret uri(https://login.live.com/oauth20_desktop.srf)

So I had my client_id, client_serect

In downloreUrl function, RequestMethod is "GET". So, I changed it to "POST".

    private String downloadUrl(String url) throws IOException {
    InputStream is = null;
    try {
        URL u = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) u.openConnection();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        conn.connect();
        is = conn.getInputStream();

        return readIt(is, 9999);
    } finally {
        if (is != null) {
            is.close();
        }
    }

but it doesn't work this app.

I changed accessing method using HttpClient, not HttpURLConnection .

I found that I access to MS cloud api with public client.

here is logcat

02-10 15:30:51.533 29336-29639/com.example.user.bandsample D/WebviewActivity: executeClient: {"error":"invalid_request","error_description":"Public clients can't send a client secret."}

Deleting client_secret, I just got access_token without refresh token.

I don't know what should I do.


Solution

  • I solved the problem.

    First, If you made mobile app from Application center, you don't need client_secret.

    I changed code URLConnection to HttpClient. URLConnection is more simple but it doesn't working.

    add this code from gradle android for using HttpClient

    useLibrary 'org.apache.http.legacy'
    

    and change code Downloadurl to new code

       public String executeClient() {
            ArrayList<NameValuePair> post = new ArrayList<NameValuePair>();
            post.add(new BasicNameValuePair("client_id", getString(R.string.client_id)));
            post.add(new BasicNameValuePair("redirect_uri", r_uri));
           // post.add(new BasicNameValuePair("client_secret", getString(R.string.client_secret)));
            post.add(new BasicNameValuePair("code", code));
            post.add(new BasicNameValuePair("grant_type", "authorization_code"));
    
            // 연결 HttpClient 객체 생성
            HttpClient client = new DefaultHttpClient();
    
    
            // 객체 연결 설정 부분, 연결 최대시간 등등
            HttpParams params = client.getParams();
            HttpConnectionParams.setConnectionTimeout(params, 5000);
            HttpConnectionParams.setSoTimeout(params, 5000);
    
            // Post객체 생성
            HttpPost httpPost = new HttpPost("https://login.live.com/oauth20_token.srf");
            HttpGet httpget = new HttpGet("https://login.live.com/oauth20_token.srf");
            try {
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(post, "UTF-8");
                // UrlEncodedFormEntity entity = new UrlEncodedFormEntity(post, "UTF-8");
                httpPost.setEntity(entity);
                // Log.d(TAG, "executeClient: " + entity);
                 HttpResponse hr = client.execute(httpPost);
                //HttpResponse hr = client.execute(httpget);
                HttpEntity resEntitiy = hr.getEntity();
                String x = EntityUtils.toString(resEntitiy);
                Log.d(TAG, "executeClient: " + x);
                return x;
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    and I used StringRequest instead of JsonObjectRequset

     StringRequest tokenRequest = new StringRequest(Request.Method.POST, uurl,
                new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.d("반응1", response.toString());
                JsonAccessTokenExtractor jate = new JsonAccessTokenExtractor();
                accessToken = jate.extractAccessToken(response.toString());
                refreshToken = jate.extractRefreshToken(response.toString());
                MainActivity.editor.putString("access_token", accessToken);
                MainActivity.editor.putString("refresh_token", refreshToken);
                MainActivity.editor.apply();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
    
                Log.d("반응1", error.toString());
                Log.d("반응1", ""+error.networkResponse.headers.toString());
            }
        }){
    
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("client_id", getString(R.string.client_id) );
                params.put("redirect_uri", r_uri);
                params.put("refresh_token", MainActivity.sharedPreferences.getString("refresh_token", "hi"));
                params.put("grant_type", "refresh_token");
                Log.d(TAG, params.toString());
                return params;
            }
    
            @Override
            public String getBodyContentType() {
                return "application/x-www-form-urlencoded; charset=UTF-8";
            }
        };