gpt4 book ai didi

java - 使用 HttpURLConnection 在 Android 中进行摘要式身份验证

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:02:14 26 4
gpt4 key购买 nike

正如问题所说,我正在尝试在 android 中进行摘要式身份验证。
到目前为止,我一直在使用 DefaultHttpClient 及其身份验证方法(使用 UsernamePasswordCredentials 等),但自 Android 5 起已弃用,并将在 Android 6 中删除。
所以我即将从 DefaultHttpClient 切换到 HttpUrlConnection
现在我正在尝试实现摘要身份验证,它应该像解释的那样工作起来非常简单 here :

Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});

但由于某些原因,getPasswordAuthentication 从未被调用过。
在我搜索这个问题的过程中,我发现了不同的帖子,说 android 中的 HttpUrlConnection 不支持摘要身份验证,但这些帖子是从 2010-2012 年开始的,所以我不确定这是否仍然正确。我们还在我们的桌面 Java 应用程序中使用带有摘要身份验证的 HttpUrlConnection,它确实有效。

我还找到了一些帖子,说的是OkHttpOkHttp 似乎被 Android 在后台使用(更具体地说是 HttpUrlConnectionImpl)。但是这个 HttpUrlConnectionImpl 有点奇怪,它甚至没有显示在 Eclipse 类型层次结构中,我无法调试它。它也应该是 com.squareup.okhttp.internal.huc.HttpUrlConnectionImpl,而在 android 中它是 com.android.okhttp.internal.http.HttpUrlConnectionImpl

所以我无法在 android 中使用此 HttpUrlConnection 进行摘要式身份验证。
谁能告诉我如何在没有外部库的情况下做到这一点?

编辑:
服务器请求摘要认证:

WWW-Authenticate: Digest realm="Realm Name",domain="/domain",nonce="nonce",algorithm=MD5,qop="auth"

所以基本身份验证应该起作用,因为服务器正在请求摘要。

最佳答案

答案是,HttpUrlConnection 不支持摘要。

因此您必须实现 RFC2617自己。

您可以使用以下代码作为基线实现:HTTP Digest Auth for Android .

涉及的步骤(引用 RFC2617):

  • 如果您收到 401 响应,遍历所有 WWW-Authenticate header 并解析它们:
    • 检查算法是否为 MD5 或未定义(可选地选择 auth qop 选项),否则忽略质询并转到下一个 header 。
    • 使用 Authenticator.requestPasswordAuthentication 获取凭据。
    • 使用用户名、领域和密码计算 H(A1)。
    • 存储规范根 URL、领域、HA1、用户名、随机数(+ 可选算法、不透明和客户端选择的 qop 选项(如果存在)。
    • 重试请求。
  • 在每个请求中,遍历您通过规范根 URL 存储 session 信息的所有领域:
    • 使用请求方法和路径计算 H(A2)。
    • 使用 HA1、随机数(+ 可选的 nc、cnonce、qop)和 HA2 计算 H(A3)。
    • 构建 Authorization header 并将其添加到您的 HttpUrlConnection
  • 实现某种 session 修剪。

通过使用 Authenticator,您可以确保一旦 HttpUrlConnection 原生支持摘要,您的代码就不会再被使用(因为您不会收到 401第一名)。

这只是关于如何实现它的简要总结,供您了解。

如果您想更进一步,您可能还想实现 SHA256:RFC7616

关于java - 使用 HttpURLConnection 在 Android 中进行摘要式身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32689185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com