Не удается получить доступ к MS Cloud API

Я хочу получить доступ к MS Cloud API на платформе Android.

Итак, я нашел один образец приложения.

Вот пример приложения, в котором работает эта функция. (https://github.com/adithya321/Companion-for-Band/blob/dev/app/src/main/java/com/pimp/companionforband/activities/cloud/WebviewActivity.java )

Я сделал приложение MS с сайта dev.app.microsoft.com.

и сделал пароль и зарегистрировал веб-платформу перенаправления uri(https://login.live.com/oauth20_desktop.srf< /а>)

Итак, у меня был мой client_id, client_serect

В функции downloreUrl RequestMethod имеет значение «GET». Итак, я изменил его на «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();
        }
    }

но это приложение не работает.

Я изменил метод доступа с помощью HttpClient, а не HttpURLConnection.

Я обнаружил, что получаю доступ к MS Cloud API с общедоступным клиентом.

вот логкэт

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."}

Удалив client_secret, я только что получил access_token без токена обновления.

Я не знаю, что мне делать.


person Charile    schedule 10.02.2017    source источник


Ответы (1)


Я решил проблему.

Во-первых, если вы сделали мобильное приложение из Центра приложений, вам не нужен client_secret.

Я изменил код URLConnection на HttpClient. URLConnection более прост, но он не работает.

добавьте этот код из gradle android для использования HttpClient

useLibrary 'org.apache.http.legacy'

и измените код Downloadurl на новый код

   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;
    }

и я использовал StringRequest вместо 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";
        }
    };
person Charile    schedule 06.04.2017