使用 Apple = invalid_client 登录

Pat*_*ick 10 php ios jwt apple-sign-in

我面临一个非常糟糕的问题,因为我阅读了很多指南和教程,但没有任何效果。

结果总是一样的: {"error":"invalid_client"}

我得到了代码、identityToken 和我需要的一切——除了对https://appleid.apple.com/auth/token的调用——因为 invalid_client。

这是我获取代码的网址。

https://appleid.apple.com/auth/authorize?response_type=code&client_id=org.example.service&redirect_uri=https%3A%2F%2Fexample.org

那么我就有了默认的工作流程。接受/登录后,我将被重定向到我的页面。

https://example.org/?code=a277243e2ec324fb09ba1c3333a8e6576.0.abcde.u4xiTDP2qHXoNEaxrcrIGx

(当我使用 JavaScript API 时,我将获得其他信息,如状态、代码和 id_token。我也已经在那里使用“代码”进行了尝试。)

回到主函数。

这是我对苹果的要求。

'client_id' => 'org.example.service',  
'client_secret' => JWT-Data encoded (OPENSSL_ALGO_SHA256) see below  
'grant_type' => 'authorization_code',  
'code' => 'a277243e2ec324fb09ba1c3333a8e6576.0.abcde.u4xiTDP2qHXoNEaxrcrIGx'  
Run Code Online (Sandbox Code Playgroud)

JWT 标头:

{
  "alg": "ES256",
  "kid": "1ABC2345DE"
}  
Run Code Online (Sandbox Code Playgroud)

JWT 有效载荷:

{
  "iss": "1A234BCD56",
  "iat": 1571269964,
  "exp": 1571273564,
  "aud": "https://appleid.apple.com",
  "sub": "org.example.service"
}
Run Code Online (Sandbox Code Playgroud)

回复:

{  
  "error": "invalid_client"  
}  
Run Code Online (Sandbox Code Playgroud)

世界上无用的错误信息。

我不知道为什么客户端应该是无效的。

我在https://developer.apple.com/account/resources/authkeys/list 中有一个密钥,下载的文件名为 AuthKey_1ABC2345DE.p8。(意味着 1ABC2345DE 是我的密钥 ID)

然后我有一个带有标识符“org.example”的本机iOS应用程序和一个带有标识符“org.example.service”的服务。

它不能同时使用 id 和混合不同的东西。

没有。无效客户端。

有人可以帮我吗?我在这里坐了几个小时,只得到 invalid_client

我的测试页面:

'client_id' => 'org.example.service',  
'client_secret' => JWT-Data encoded (OPENSSL_ALGO_SHA256) see below  
'grant_type' => 'authorization_code',  
'code' => 'a277243e2ec324fb09ba1c3333a8e6576.0.abcde.u4xiTDP2qHXoNEaxrcrIGx'  
Run Code Online (Sandbox Code Playgroud)

和 PHP:

{
  "alg": "ES256",
  "kid": "1ABC2345DE"
}  
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 7

问题在于这种特殊的加密。\n在这个博客中,除了 client_secret 生成之外,他们使用 PHP 进行所有操作。\n https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign -与苹果

\n\n

而在文中作者对这句话进行了解释:

\n\n
Some JWT libraries don\xe2\x80\x99t support elliptic curve methods, so make sure yours does before you start trying this out.\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在它可以正常使用顶部的代码 - 仅替换了 client_secret 生成。

\n

  • 为感兴趣的人添加一些详细信息:{“error”:“invalid_client”}消息可能与 openssl_sign 函数生成的无效签名有关。必须使用 ES256 算法才能对 JWT 进行签名,并且生成的签名应该是两个无符号整数的串联,表示为 R 和 S。事实证明,openssl_sign 函数生成的 DER 编码的 ASN.1 签名不正确对于苹果来说。有关详细信息,请参阅 /sf/ask/4181624191/#59842760 (4认同)