使用 Apple 登录 - 无法验证授权授予代码

Posted

技术标签:

【中文标题】使用 Apple 登录 - 无法验证授权授予代码【英文标题】:Sign In with Apple - Cannot Validate the Authorization Grant Code 【发布时间】:2021-09-27 22:58:46 【问题描述】:

我正在努力将 Sign In with Apple 集成到我的应用中。该应用程序是使用 expo 用 React Native 编写的,我现在几乎完全在使用这个组件。 https://docs.expo.io/versions/latest/sdk/apple-authentication/#usage

我已经能够使用此组件成功生成授权授予代码,但是,我无法在服务器端对其进行验证。这是我目前遇到的错误:


    "error": "invalid_grant",
    "error_description": "The code has expired or has been revoked."

详情

我已将 Sign In with Apple 密钥添加到我的应用程序并下载了私钥。我已将应用程序发布到 TestFlight,因此我得到了自己的包标识符,而不是模拟器中的 Expo。

这是来自第一个请求的授权授予代码的格式(格式不是 JSON,因为它是 go 的输出):


   realUserStatus:1 ,
   authorizationCode:xxxx ,
   fullName:
        middleName:null
        nameSuffix:null 
        namePrefix:null
        givenName:null 
        familyName:null
        nickname:null 
   state:null 
   identityToken:xxxxxxx
   email:null 
   user:xxxxx      

我正在使用这个库来生成验证请求:https://github.com/pagnihotry/siwago 我正在从我的笔记本电脑(不是与应用关联的域)运行 go 脚本,并将信息复制/粘贴到 Postman。

这两种方法都使用 x-www-form-urlencoded。 go 应用程序正在签署 client_secret,我认为这是正确的方式,因为我不再获得 400 invalid_client。我已解码 client_secret 并确认验证请求已格式化:


  "alg": "ES256",
  "kid": "SECRET_KEY_ID"


  "iss": "TEAM_ID",
  "iat": 1626740200,
  "exp": 1629332200,
  "aud": "https://appleid.apple.com",
  "sub": "BUNDLE_ID"

我已通过根据我的私钥的公共补充验证客户端密码来确认客户端密码是用我的私钥签名的。

https://appleid.apple.com/auth/token请求授权的表单数据为(数值上没有标点符号):

client_id: [BUNDLE_ID]
client_secret: [signed secret]
code: [authorizationCode] (from the Authorization grant code)
grant_type: authorization_code
redirect_uri: [left empty in go, not a key in Postman]

我反复请求我的授权码,并认为我可能会被限制,但我第一次尝试了一个全新的,但仍然得到 invalid_grant 响应。

寻求任何帮助,我在过去的两天里一直在做这件事,已经筋疲力尽了。

【问题讨论】:

【参考方案1】:

我认为 Apple 的服务器需要更多时间,因为我已经看到其他帖子与此提及类似的问题。我等了大约两天,又试了一次,没有问题。

【讨论】:

以上是关于使用 Apple 登录 - 无法验证授权授予代码的主要内容,如果未能解决你的问题,请参考以下文章

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

Apple 登录“invalid_client”,使用 PHP 和 openSSL 签署 JWT 进行身份验证

如何利用 AWS Cognito 托管 UI 进行授权代码授予流程

在 Angular 中实现 OAuth 2.0 授权代码授予

Spring security登录授权验证的简单例子

授权代码流与受信任应用程序的资源所有者密码授予