针对 Spring Boot API 的 Android 身份验证不起作用
Posted
技术标签:
【中文标题】针对 Spring Boot API 的 Android 身份验证不起作用【英文标题】:Android authentication against Spring Boot API not working 【发布时间】:2020-12-12 16:31:56 【问题描述】:我有一个使用 Auth0 JWT 身份验证的 Spring Boot 后端 API,目前有两个客户端,一个 Vue SPA 和一个 android 应用程序。 Vue SPA 工作正常。它在 Auth0 中使用 SPA Application 类型,身份验证机制使用 Audience,如下所示:
"domain": "mycompany.auth0.com",
"clientId": "mySPAclientID",
"audience": "https://myaudience.mycompany.com"
我想我可以在 Android 中做类似的事情,所以我在我的 Auth0 仪表板中创建了一个原生应用程序类型,下载了相应的快速入门,并尝试进行身份验证。当然,我能够针对 Auth0 进行身份验证并取回 JWT,但是 JWT 不适用于我的 Spring Boot API,该 API 由我的 https://myaudience.mycompany.com 受众指定,并且我的 Spring Boot 安全配置预计会出现在其中智威汤逊。我的第一个想法是我可以简单地将受众添加到 Android 应用中的登录操作:
WebAuthProvider.login(auth0)
.withScheme("demo")
.withAudience(String.format("https://%s/userinfo", getString(R.string.com_auth0_domain)))
.withAudience("https://myaudience.mycompany.com") // added this
.start(this, new AuthCallback() ...
但这不起作用。当我解析返回的 JWT 时,观众部分不包含预期的块。它应该是这样的:
"aud": [
"https://myaudience.mycompany.com",
"https://mycompany.auth0.com/userinfo"
]
但它看起来像这样:
"aud": "myNativeClientID"
它也完全缺少范围元素。使这项工作的正确方法是什么?我需要一个新的 Auth0 API,这需要一个新的 Spring Boot 安全机制吗?还是登录请求中缺少一些简单的东西?或者我的 Auth0 本机应用程序中缺少一些配置?我已经阅读了所有相关文档,但没有任何效果。我不知道如何继续,任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:在 Auth0 员工的帮助下,我意识到我将 Auth0 ID 令牌与访问令牌混淆了。在 Auth0 中,ID 令牌总是作为 JWT 发布,但它们不能用于访问 Auth0 API,只有访问令牌可以做到这一点。麻烦的是,除非您在登录请求中指定“受众”,否则访问令牌是这样的简单令牌格式:
1v-QyDrPaJ5rOUBOk3g_0HtEwtN4C-4U
但是当你添加一个受众(即一个 Auth0 API,它反过来又在你的后端被引用,不管它是什么,在我的例子中是 Spring Boot),访问令牌就变成了一个具有所有必需的受众和范围的 JWT (默认情况下,范围仅限于 openapi,我相信)。
因此,因为访问令牌不是 JWT(因为我在第一次检查登录响应时还没有添加受众),所以我将其关闭,并使用 ID 令牌,正如我所提到的那样用于访问 Auth0 API。一旦我恢复使用访问令牌 JWT,一切都按预期工作。
接受此作为答案,以防将来对任何人有所帮助。
【讨论】:
以上是关于针对 Spring Boot API 的 Android 身份验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 RESTful 登录 API 验证我的 Spring Boot 应用程序
Spring Boot @ControllerAdvice 异常处理程序未触发
解决了! - Spring boot:获取 415 不支持的媒体类型