Android - Retrofit 2 - 身份验证器结果

2023-11-21

我正在尝试使用 Retrofit (2.0.0-beta3),但是当使用身份验证器添加令牌时,我似乎无法从同步调用中获取数据。我们在后端的日志记录只显示了很多登录尝试,但我无法从正文中获取数据来实际添加到标头中。

    public static class TokenAuthenticator implements Authenticator {
    @Override
    public Request authenticate(Route route, Response response) throws IOException {
        // Refresh your access_token using a synchronous api request
        UserService userService = createService(UserService.class);

        Call<Session> call = userService.emailLogin(new Credentials("handle", "pass"));

        // This call is made correctly, as it shows up on the back-end.
        Session body = call.execute().body();

        // This line is never hit.
        Logger.d("Session token: " + body.token);

        // Add new header to rejected request and retry it
        return response.request().newBuilder()
                .header("Auth-Token", body.token)
                .build();
        }
    }

我不太确定为什么它甚至不打印任何东西。任何有关如何解决此问题的提示将不胜感激,感谢您花时间提供帮助。


这些是我一直在阅读的有关如何实施 Retrofit 的资料。

使用身份验证器:

  • https://stackoverflow.com/a/31624433/3106174

  • https://github.com/square/okhttp/wiki/Recipes#handling-authentication

使用 Retrofit 2 进行同步调用:

  • https://futurestud.io/blog/retrofit-synchronous-and-asynchronous-requests

我设法使用 TokenAuthenticator 和拦截器获得了一个不错的解决方案,并认为我会分享这个想法,因为它可能会帮助其他人。

添加“TokenInterceptor”类来处理将令牌添加到标头的情况是令牌存在,而“TokenAuthenticator”类则处理不存在令牌的情况,我们需要生成一个令牌。

我确信有一些更好的方法来实现这一点,但我认为这是一个很好的起点。

public static class TokenAuthenticator implements Authenticator {
    @Override
    public Request authenticate( Route route, Response response) throws IOException {
    ...
    Session body = call.execute().body();
    Logger.d("Session token: " + body.token);
    // Storing the token somewhere.
    session.token = body.token;
    ...
}


private static class TokenInterceptor implements Interceptor {
@Override
    public Response intercept( Chain chain ) throws IOException {
        Request originalRequest = chain.request();

        // Nothing to add to intercepted request if:
        // a) Authorization value is empty because user is not logged in yet
        // b) There is already a header with updated Authorization value
        if (authorizationTokenIsEmpty() || alreadyHasAuthorizationHeader(originalRequest)) {
            return chain.proceed(originalRequest);
        }

        // Add authorization header with updated authorization value to  intercepted request
        Request authorisedRequest = originalRequest.newBuilder()
                .header("Auth-Token", session.token )
                .build();
        return chain.proceed(authorisedRequest);
    }
}

Source:

http://lgvalle.xyz/2015/07/27/okhttp-authentication/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - Retrofit 2 - 身份验证器结果 的相关文章

随机推荐

  • 自动批准评论插件中的所有评论

    有没有办法自动批准并默认公开所有评论插件的评论 另外 我真的需要知道这些评论是在什么基础上进行审核的 在某些页面上 它们默认是公开的 而在其他页面上 它们最终会进入审核队列 更新 0 我删除了脸书 管理员 审核 UI 消失 但审核仍然有效
  • 使用 Zend Framework 安全地运行 Cron 作业

    我看过很多关于 cron 和 ZF 的帖子 但大多数解决方案都让工作可以由公众触发运行 如果你想设置一个只能由 cron 运行的操作怎么办 不是由某个匿名用户也不是由必须登录的人 我使用的解决方案涉及将一个文件放在我的 Web 根目录之外
  • 在 Javascript 中播种随机数生成器

    是否可以为随机数生成器提供种子 Math random 在 JavaScript 中 不 不可能播种Math random The ECMAScript 规范故意在这个主题上含糊其辞 不提供播种方式 也不要求浏览器使用相同的算法 所以这样的
  • 提交前获取应用程序的 iTunes 链接

    我在另一篇文章中读到 您可以在没有二进制文件的情况下提交应用程序 但根据我所看到的 这不再可能 看来没有二进制文件就无法提交 并且二进制文件是通过应用程序加载器提交的 在提交二进制文件之前 还有其他已知的方法可以获取指向我的应用程序的 it
  • 我不明白 sigma 表示法和 for 循环

    我有一本书说 并说这相当于说 for i 1 i lt N i Sum i 它进一步说利用这个简单的公式 因为 最大值 最小值 1 它说将其更改为 C 代码将是 for k j k lt 1 k Sum k 但是 我真的无法理解这一点 谁能
  • 为什么浏览器无法发送gzip请求?

    如果网络服务器可以发送 gzip 响应 为什么浏览器不能发送 gzip 请求 客户端和服务器必须就如何通信达成一致 其中一部分是通信是否可以被压缩 HTTP 被设计为请求 响应模型 最初的创建几乎可以肯定地设想总是有小请求和潜在的大响应 压
  • 如何在一个屏幕而不是整个应用程序中处理退出应用程序 - React Native?

    我有一些问题返回处理程序 问题是 运行应用程序并转到 注册 屏幕并触摸手机背面时 他们将运行该功能并显示警报进行确认 但现在当我转到任何其他屏幕并触摸背面时 他们将需要每次返回时就返回上一个屏幕 BackHandler exitApp 运行
  • 将断点保存到文件

    调试 Python 代码时 我从命令行通过 ipdb 运行脚本 并设置了多个断点 然后我对一个或多个模块进行一些更改 然后重新运行 但是 如果我只是使用运行模块不要重新加载 为了确保它们确实如此 我可以完全存在并重新启动Python 但随后
  • 如何获得英文的 boost::system::error_code::message ?

    在具有本地化 UI 的 Win7 上 error code message 返回非英语消息 据我所知 在 Boost 1 54 中 对于system error category 上面的函数归结为以下 WinAPI 调用 DWORD ret
  • 如何使用 ExecutorService 等待所有线程完成?

    我需要一次执行 4 个任务 如下所示 ExecutorService taskExecutor Executors newFixedThreadPool 4 while taskExecutor execute new MyTask wai
  • 如何在 macOS 或 OS X 上安装 pip?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 昨天我花了一整天的时间寻找安装的明确答案pip Python 的包管理器 我找不到好的解决办法 我该如何安装它 在 Linux 或 MacOS 上 python
  • 在 Laravel Homestead 上使用 SSL

    我正在使用 Laravel Homestead 它运行良好 现在我想在我的一个网站上实施 HTTPS 我发现要实现这一点 你只需要添加ssl true进入 Homestead yaml 然后运行 vagrant reload provisi
  • 使用 pywin32 控制 Adob​​e Acrobat 时出现“未实现”异常

    我使用 pywin32 在 python 中编写了一个脚本 将 pdf 文件保存为文本 直到最近都工作正常 我在 Excel 中使用类似的方法 代码如下 def pdf2Txt self pdf fileformat com adobe a
  • 如何重写javascript中的eval函数?

    例如 function var proxied window eval window eval function return proxied apply this arguments 但这段代码不起作用 eval是魔法 与 真实 函数不同
  • 在 Jquery 中创建随机下落物体

    我试图让div从上到下下降 这是我尝试过的代码 但它不能满足我的需求 我想在准备好后生成 20 div 然后如何使该 20 div 持续从上到下一致地下降 在 jquery 中是否可以做到这一点 http jsfiddle net MzVF
  • Javamail 和 Gmail Pop3 SSL

    我正在尝试将我的应用程序连接到 Gmail 以检查电子邮件 我必须对 POP3 使用 SSL 这是我的代码 Properties props new Properties props put mail host pop gmail com
  • 检查是否连接到Wi-Fi网络C#

    有没有办法检查电脑是否连接到wifi网络 另外 如果已连接 我想要 SSID 可能的 检查互联网连接的部分在这里回答 C 检查互联网连接 SSID部分在这里回答 获取我在 Windows Vista 上使用 C Net 连接到的无线网络的
  • 使用 JQuery 计时器调用 js 函数

    无论如何 有没有办法为 JQuery 实现计时器 例如 每10秒需要调用一个js函数 我尝试了以下方法 window setTimeout function alert test 10000 但这只执行一次 然后就不会再执行了 你可以使用这
  • str.format() -> 如何左对齐

    gt gt gt print there are 0 10 students and 1 10 teachers format scnt tcnt there are 100 students and 20 teachers 输出的代码是什
  • Android - Retrofit 2 - 身份验证器结果

    我正在尝试使用 Retrofit 2 0 0 beta3 但是当使用身份验证器添加令牌时 我似乎无法从同步调用中获取数据 我们在后端的日志记录只显示了很多登录尝试 但我无法从正文中获取数据来实际添加到标头中 public static cl