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