使用Apple刷新令牌验证仅返回访问令牌

时间:2020-10-10 03:53:42

标签: ios node.js flutter refresh-token sign-in-with-apple

我正在使用服务器中的 AppleAuth npm软件包在使用Apple登录过程中向Apple的服务器提交令牌请求。 (这是基于pub.dev中sign_in_with_apple package随附的示例服务器代码而来的)我没有提交授权代码以获取我的首次访问和刷新令牌的问题。

但是,当尝试测试我的应用如何获取新的刷新令牌时,当我将grant_type设置为refresh_token的情况下向https://appleid.apple.com/auth/token提交POST请求时,得到的响应是与将grant_type设置为authorization_code有所不同。

我查看了该程序包的源代码,对于它的AppleAuth(myConfig).refreshToken(myRefreshToken)(<-伪代码,大声笑),POST有效负载中唯一的区别是:

{
 grant_type: 'refresh_token', // instead of grant_type: 'authorization_code'
 refresh_token: refreshToken, // instead of code: authorizationCode
 ... // other params
}

尽管带有授权码的初始请求同时返回访问令牌和刷新令牌,但由于某种原因,刷新令牌请求仅返回访问令牌。我真的不认为是导致错误的软件包,也看不出我的代码将如何成为源,因为上面的代码是唯一的区别。

我尝试在新的刷新令牌请求中传递它返回的访问令牌,以测试将来在需要时可以获取新的刷新令牌,但它返回400状态错误。

我在这里想念什么吗?是否有刷新令牌请求不返回新的刷新令牌的原因?还是我完全缺少有关流程/流程应该如何工作的信息?我正在尝试执行该过程的“每天检查一次刷新令牌,以确认用户在Apple的服务器上仍然保持良好的信誉”。

我现在真的很难做。我可以在数据库中保存identity_token.sub字段,以检查我的用户是否已登录,但是我当然想确保用户的apple ID对apple仍然有效,并且他们没有撤消访问权限。可能是因为我太早尝试获取新的refresh_token了,Apple只返回了access_token吗?

哦,该应用程序本身就是Flutter应用程序,我正在iPhone 11上测试所有这些内容,因此它不是Android / Web流。

1 个答案:

答案 0 :(得分:1)

刷新令牌授予响应中是否获得新的“滚动/旋转”刷新令牌通常是特定于供应商的:

  • 您可能偶尔但并非总是获得新的刷新令牌
  • 此消息的主要目的是获取新的访问令牌,而不是新的刷新令牌

在令牌处理方面,客户端应类似于this sample of mine中的saveTokens方法来更新其令牌。

我没有在Apple上使用Sign In,但我怀疑按以下步骤进行将是最简单的解决方案:

  • 保持访问令牌的生命短暂:不超过60分钟
  • 这会强制频繁刷新令牌,默认情况下刷新速度很快
  • 如果用户的Apple ID被吊销,我希望它会返回一个invalid_grant响应