我正在尝试向我的服务器 ruby on Rails 应用程序验证 Android 客户端应用程序,该应用程序使用 Devise gem。但我尝试过 http 身份验证,并发布请求进行身份验证,并且服务器仅对任何给定的用户名/密码响应 200。
我已经在用户模型中设置了 config.http_authenticatable = true 和 :database_authenticable ...
我将发布我的身份验证方法,以便大家可以查看...
public static boolean authenticate(User user, String verb) throws IOException, JSONException
{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(verb);
CredentialsProvider credProvider = new BasicCredentialsProvider();
credProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
new UsernamePasswordCredentials(user.getMail(), user.getPassword()));
httpClient.setCredentialsProvider(credProvider);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("email", user.getMail()));
nameValuePairs.add(new BasicNameValuePair("password", user.getPassword()));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse httpResponse = httpClient.execute(httpPost);
int statusCode = httpResponse.getStatusLine().getStatusCode();
//JSONObject resp = null;
if (statusCode < 200 || statusCode >= 300){
throw new IOException("Error");
}
return true;
}
如果服务器响应 200,这听起来确实像服务器端配置,因此您应该使用桌面 Web 浏览器和 Fiddler 等工具仔细检查您的 URL 是否确实安全,以便您可以看到所有内容。特别注意身份验证标头和状态代码;至少你应该看到来自服务器的 401 来开始工作。
您还可以在设备上打开 Apache HTTP 的诊断,它还会将标头和内容转储到 LOGCAT,以便您可以确保一切正常进行。
检查 WWW-Autnenticate 标头的内容,它将指定接受哪些方案。客户端将重新请求该 URL,但会将 Authorization 标头放入其请求中。
简而言之,确保您的服务器端在应用程序之外、更容易排除故障的环境中工作。
客户端,看起来您只激活了 BASIC 身份验证(每个人都停止使用它!),并且您的端点可能只需要 DIGEST 或 NTLM 或 KERBEROS 或除 BASIC 之外的任何其他身份验证方案。由于您似乎没有设置 SSL,因此请至少使用 DIGEST,否则您会遇到明文问题!
使用表单变量(用于身份验证)仅适用于应用程序级别,而不适用于 HTTP 协议级别,后者使用 HTTP 标头(WWW-Autnenticate、Authorization)和状态代码(401、403)进行身份验证过程。再说一遍,如果您没有将服务器(和客户端)配置为仅 SSL,则会出现明文问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)