Android istemci kimlik doğrulama anahtarı alınamadı

oy
0

Ben oauth 2 kimlik doğrulaması gerektiren bir uygulama inşa ediyorum. Almak için son nokta access_token olan https://10.0.2.2:8443/oauth/token(10.0.2.2 ana bilgisayarda localhost'a almak için geri döngü olduğunu)

Benim tarayıcı aracılığıyla istek yaptığınızda gayet güzel çalışıyor, ancak Java kodu ile bunu yaparken, ben kötü isteği almak ve yeterince bilgi giderilir alamadım.

PostMan

Güvenli olmayan bir httpclient kullanmak (biliyorum Evet, bu korkunç güvensiz)

public class UnsafeHttpsClient {

    public static HttpClient getNewHttpClient() {
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null, null);

            MySSLSocketFactory sf = new MySSLSocketFactory(trustStore);
            sf.setHostnameVerifier(sf.ALLOW_ALL_HOSTNAME_VERIFIER);

            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme(http, PlainSocketFactory.getSocketFactory(), 8080));
            registry.register(new Scheme(https, sf, 8443));

            ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

            return new DefaultHttpClient(ccm, params);
        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }

}

Ben de bu sınıfı kullanır. Referans: Kod SO bu görevinden alındı HTTPS üzerinden HttpClient kullanarak tüm sertifikaları güvenmeniz

public class MySSLSocketFactory extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance(TLS);

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        sslContext.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

Ve son olarak, benim isteği oluşturmak için bu sınıflar hem kullanın:

public class TaskAuthenticate extends AsyncTask<String, Integer, JSONArray> {

    private Context ctx;
    public IApiAccessResponse delegate=null;
    private HttpClient mHttpclient = UnsafeHttpsClient.getNewHttpClient();
    private HttpPost mHttppost;
    private String client_string = mobile:;
    public TaskAuthenticate (Context ctx) {
        this.ctx = ctx;
    }


    protected JSONArray doInBackground(String... params) {
         String strTokenUrl = ctx.getResources().getString(R.string.oauth2_endpoint);

         mHttppost = new HttpPost();
         try {
             mHttppost.setURI(new URI(strTokenUrl));
         }
         catch (URISyntaxException e1) {
             e1.printStackTrace();
         }
         List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
         nameValuePairs.add(new BasicNameValuePair(username, params[0]));
         nameValuePairs.add(new BasicNameValuePair(password, params[1]));
         nameValuePairs.add(new BasicNameValuePair(grant_type, password));
         nameValuePairs.add(new BasicNameValuePair(client_id, mobile));
//       nameValuePairs.add(new BasicNameValuePair(client_secret,));
         try {
            String header = Basic  + Base64.encodeToString(client_string.getBytes(UTF-8), Base64.DEFAULT);
            mHttppost.setHeader(Authorization, header);
            mHttppost.setHeader(Content-Type,
                    application/x-www-form-urlencoded;charset=UTF-8);
            mHttppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, UTF-8));
         }
         catch (UnsupportedEncodingException e) {
            e.printStackTrace();
         }

        HttpResponse response;
        try {
            response  = mHttpclient.execute(mHttppost);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
            response = null;
        } catch (IOException e) {
            e.printStackTrace();
            response = null;
        }

        JSONArray result = null;
        try {
            result = new JSONArray(EntityUtils.toString(response.getEntity()));
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

Bunu yürütmek, ben bir olsun 400 - Bad requesttepkisini. Aşağıdaki kod ile cevap gövdesini tutmayacak Ayrıca eğer

 HttpEntity respEntity = response.getEntity();
    if(respEntity!=null) {
        String res = EntityUtils.toString(respEntity);
    }

Vücut ben sorunun ne olabileceğini konusunda biraz clueless yani benim tarayıcıda yeniden edemedi, Şimdiye kadar geriye boş bir dize olarak gelir. Ben temelde yanlış yapıyorum bir şey var mı? Bu hata ayıklamak için herhangi bir ipucu mutluluk duyacağız

sunucu kodu gerekiyorsa, bunu yayınlayacağız, ama ben tarayıcıda isteği yapabilir beri sorun uygulamasında olduğunu düşünüyorum.

Oluştur 22/11/2014 saat 21:22
kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Sana karakter yalnızca POST isteği için sorunlara neden-sonu hattı, isteğiniz için bir başlık eklediğinizde problem.It görünen ne anladım. düzeltme emin çizgi karakteri sonu bulunmaz hale getirmek için bit maskesi değiştirmekti. Bu hattı değiştirdik:

String header = "Basic " + Base64.encodeToString(client_string.getBytes("UTF-8"), Base64.DEFAULT);

tarafından:

String header = "Basic " + Base64.encodeToString(client_string.getBytes("UTF-8"), Base64.URL_SAFE|Base64.NO_WRAP);
Cevap 23/11/2014 saat 19:52
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more