关于android设备的unauthorized

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于android设备的unauthorized相关的知识,希望对你有一定的参考价值。

参考技术A 下学期认真搞android开发,然后有机房的eclipse+SDK+ADT以及笔电的android studio双开发环境支持,瞬间感觉底气十足

因为android studio自带的虚拟机相机硬件调用比较烦人,并且没有办法进行android studio下的junit测试,所以又忍不住入手了日版的S5一部,然后愉快开始了双测试环境的切换生涯。

在eclipse+SDK+ADT的机房xp系统里面,S5打开开发者选项->打开usb调试选项,很顺利的让我手机上点击确定密钥进行连接,然后就可以用adb 命令顺利操作手机的apk安装 卸载啊 查看shell用root命令【但是貌似还是要在手机上再点击确认一下超级权限的,否则就是静默拒绝了权限申请啊。。】

然后我是买了快半个月的时候,换到家里笔电的android studio来试试测试S5的,主要是想用shell来删掉相机的拍照时候的声音,单手首先就遇到了unauthorized的问题,百度了一下,usb调试没打是很多时候出现这种情况的主要原因,但是我之前按照和机房里面一样的操作,一样点选了usb调试后再点选了公钥怎么就unauthorized了。。百思不得其解啊,无奈就只好断开连接,重新插usb,重新点选usb调试,看到了在这里的点选公钥的悬浮框下面有一行是否是15分钟断开。。。难怪了,连上没一会就没有授权,赶紧把这个选项点选了。。。手机就再也没出现设备unauthorized了

android - EWS 2010 中的基本身份验证错误“HTTP/1.1 401 Unauthorized”

【中文标题】android - EWS 2010 中的基本身份验证错误“HTTP/1.1 401 Unauthorized”【英文标题】:Error "HTTP/1.1 401 Unauthorized" with basic authentication in android - EWS 2010 【发布时间】:2012-05-11 13:28:18 【问题描述】:

我参考this link 向服务器请求。问题是有时(不总是,大约 20% - 30%,意味着有时我可以获得成功的响应),我收到 401 错误和服务器响应预期的基本授权挑战,但未找到。 p>

这是我的代码:

 HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor()

    public void process(final HttpRequest request, final HttpContext context)
            throws HttpException, IOException
    
        AuthState authState = (AuthState) context
                .getAttribute(ClientContext.TARGET_AUTH_STATE);
        CredentialsProvider credsProvider = (CredentialsProvider) context
                .getAttribute(ClientContext.CREDS_PROVIDER);
        HttpHost targetHost = (HttpHost) context
                .getAttribute(ExecutionContext.HTTP_TARGET_HOST);

        if (authState.getAuthScheme() == null)
        
            AuthScope authScope = new AuthScope(targetHost.getHostName(),
                    targetHost.getPort());
            Credentials creds = credsProvider.getCredentials(authScope);
            if (creds != null)
            
                authState.setAuthScheme(new BasicScheme());
                authState.setCredentials(creds);
            
        
    
;

这是我的身份验证:

    HttpPost httpPost = new HttpPost(SERVER_AUTH_URL);
        httpPost.setHeader("Content-type", "text/xml; charset=utf-8");
    httpPost.setHeader("Keep-Alive", "300");
    httpPost.setHeader("Connection", "Keep-Alive");     
    StringEntity se = new StringEntity(myRequest, "UTF-8");
    httpPost.setEntity(se);
    se.setContentType("text/xml");
    se.setContentEncoding("gzip,deflate");

        //add preemptiveAuth
        client.addRequestInterceptor(preemptiveAuth, 0);
        //Set the proxy
    ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
            client.getConnectionManager().getSchemeRegistry(),
            ProxySelector.getDefault());
    client.setRoutePlanner(routePlanner);

    List<String> authPrefs = new ArrayList<String>();
    authPrefs.add(AuthPolicy.BASIC);
    authPrefs.add(AuthPolicy.NTLM);
    authPrefs.add(AuthPolicy.DIGEST);
    client.getParams().setParameter("http.auth.scheme-priority", authPrefs);
    CredentialsProvider credProvider = new BasicCredentialsProvider();                 
    // client.getParams().setParameter("http.auth.scheme-priority",
    // authPrefs);
    credProvider.setCredentials(AuthScope.ANY,
            new NTCredentials(getUsername(), getPassword(),
                    "", getDomain()));

    Log.d(TAG, "repair excute");
    client.setCredentialsProvider(credProvider);
    HttpResponse response = client.execute(httpPost);
    Log.d(TAG, "has excute");

从注释代码中可以看出我尝试了很多方法,但错误并没有消失。这里是 logcat 说的:

 05-02 10:28:21.724: D/dalvikvm(1169): GC_FOR_MALLOC freed 11259 objects / 457352 bytes in 43ms
 05-02 10:28:22.384: D/MainActivity(1169): repair excute
 05-02 10:28:22.744: D/dalvikvm(1169): GC_FOR_MALLOC freed 11481 objects / 447264 bytes in 67ms
 05-02 10:28:22.894: D/dalvikvm(1169): GC_FOR_MALLOC freed 1078 objects / 83928 bytes in 76ms
 05-02 10:28:22.894: I/dalvikvm-heap(1169): Grow heap (frag case) to 3.833MB for 87396-byte allocation
 05-02 10:28:23.034: D/dalvikvm(1169): GC_FOR_MALLOC freed 58 objects / 3336 bytes in 143ms
 05-02 10:28:23.124: W/DefaultRequestDirector(1169): Authentication error: basic authorization challenge expected, but not found
 05-02 10:28:23.124: D/MainActivity(1169): has excute
 05-02 10:28:23.124: E/MainActivity(1169): response error: HTTP/1.1 401 Unauthorized

所以,请告诉我我的问题在哪里。提前致谢。更新:目标服务器是 Exchange Web Service 2010。出于某种原因,我不想使用 EWS API,我提出了自己的 xml 请求以连接到服务器(此 xml 请求正常工作)。 这是来自服务器的响应标头 请求失败时:

Server   Microsoft-IIS/7.5
WWW-Authenticate   Negotiate
WWW-Authenticate   NTLM
X-Powered-By   ASP.NET
Date   Fri, 25 May 2012 03:47:57 GMT
Content-Length   0

第一次请求成功时:

Cache-Control   private
Transfer-Encoding   chunked
Content-Type   text/xml; charset=utf-8
Server   Microsoft-IIS/7.5
Set-Cookie   exchangecookie=1d9d9b1d21064035ad375c8aecde2168; expires=Sat, 25-May-2013     04:00:46 GMT; path=/; HttpOnly
X-AspNet-Version   2.0.50727
X-Powered-By   ASP.NET
Date   Fri, 25 May 2012 04:00:45 GMT

第二次:

Cache-Control   private
Transfer-Encoding   chunked
Content-Type   text/xml; charset=utf-8
Server   Microsoft-IIS/7.5
X-EwsPerformanceData   RpcC=4;RpcL=0;LdapC=0;LdapL=0;
X-AspNet-Version   2.0.50727
X-Powered-By   ASP.NET
Date   Fri, 25 May 2012 04:00:47 GMT

cookie 是我的问题,不是吗?

【问题讨论】:

使用 Wireshark 确保它发送您期望的内容。 谢谢,我使用 SoapUI 发出请求,它总是有效,但我不知道为什么仍然有错误 在您的应用程序(如果您在模拟器上运行,指的是运行模拟器的实际计算机)和目标服务器之间是否有任何代理服务器? 是的,但是我也在真机连接服务器上测试过,还是有这个错误。 请在每个ifelse 中添加一些日志语句,并检查authState.getAuthScheme()creds 在什么情况下为空。 【参考方案1】:

上周我在 Android HTTP basic 上苦苦挣扎。我已经尝试了 3 或 4 种不同的方法,但我总是发现一些问题。现在,我设法使它工作的唯一方法是最简单的方法。

 UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, pass);
 Header header = new BasicScheme().authenticate(credentials, mHttpRequest);
 mHttpRequest.addHeader(header);

AndroidHttpClient 对我有用。

编辑:

这是我的完整源代码

https://gist.github.com/2642692

它基于 http://lukencode.com/2010/04/27/calling-web-services-in-android-using-httpclient/

【讨论】:

您是否建议使用 NTLM 身份验证?因为我收到此错误:“不支持身份验证方案 ntlm”身份验证错误:无法响应任何这些挑战:ntlm=WWW-Authenticate: NTLM,negotiate=WWW-Authenticate: Negotiate 我不知道 NTLM 我从未使用过 IIS。关于那看看这篇文章***.com/questions/7037105/… 问题是我尝试请求 EWS 服务器,它需要基本身份验证 我不知道会发生什么,但是在 Apache 上使用抢先式基本身份验证进行日志记录可以与我之前发布的代码一起使用。 EWS 无法帮助您,抱歉。

以上是关于关于android设备的unauthorized的主要内容,如果未能解决你的问题,请参考以下文章

android - EWS 2010 中的基本身份验证错误“HTTP/1.1 401 Unauthorized”

Android 解决手机unauthorized错误

Webservice 在 Android Retrofit 中不工作,但在 Postman 和 Swift / iOS 中工作,得到 401 Unauthorized

如何在 Android 中检测设备状态离线/在线

如何使用javascript检测android设备中的键盘关闭事件

关于Android的Build类——获取Android手机设备各种信息