无法访问 MS 云 api

Can't access MS cloud api

我想在 android 平台上访问 MS 云 api。

所以我找到了一个示例应用程序。

这是使用此功能的示例应用程序。 (https://github.com/adithya321/Companion-for-Band/blob/dev/app/src/main/java/com/pimp/companionforband/activities/cloud/WebviewActivity.java)

我从 dev.app.microsoft.com

制作了 MS 应用程序

并设置密码并注册网络平台rediret 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 。

我发现我可以使用 public 客户端访问 MS 云 api。

这里是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."}

正在删除 client_secret,我刚得到 access_token 没有刷新令牌。

我不知道该怎么办。

我解决了问题。

首先,如果您从应用中心制作移动应用程序,则不需要client_secret。

我将代码 URLConnection 更改为 HttpClient。 URLConnection 更简单,但它不起作用。

从 gradle android 添加此代码以使用 HttpClient

useLibrary 'org.apache.http.legacy'

并将代码下载网址更改为新代码

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