我正在尝试构建一个简单的后端来支持Apple登录。
根据文档,我可以从客户端获取authorizationCode
。
第一个问题是sdk以Data
的形式提供该值。
使用String(data: authCode, encoding: .utf8)
将其转换为字符串是否正确,还是需要像推送通知令牌一样使用authCode .map { data in String(format: "%02.2hhx", data) }
?
我认为正确的方法应该是第一种,但我不确定。
我的后端代码如下:
function handleRegisterTokenPost($arguments) {
if (!isset($arguments['code'])) {
badRequest();
}
$key = <<<EOD
-----BEGIN PRIVATE KEY-----
my
multiline
api
key
-----END PRIVATE KEY-----
EOD;
$kid = 'MYKID(from developer.apple)';
$iss = 'MYTeamIdentifier';
$clientID = 'MyBundleID';
$token = array(
"iss" => $iss,
"iat" => time(),
"exp" => time() + 100000,
"aud" => "https://appleid.apple.com",
"sub" => $clientID
);
$jwt = JWT::encode($token, $key, 'ES256', $kid);
var_dump($jwt);
$data = [
'client_id' => $clientID,
'client_secret' => $jwt,
'code' => $arguments['code'],
'grant_type' => 'authorization_code',
'redirect_uri' => 'myredirecturl'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://appleid.apple.com/auth/token');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
$serverOutput = curl_exec($ch);
curl_close ($ch);
echo $serverOutput;
当我尝试通过jwt.io解码JWT令牌时,得到的解码令牌与documentation(在页面末尾)上的示例非常相似
我正在使用this library对jwt令牌进行编码。
问题是我不断收到{"error":"invalid_client"}
。
即使我提供一个随机字符串作为“代码”,我也会遇到同样的错误,这就是为什么我认为这可能是如何生成此代码的问题,但我不确定。
有人有我可以尝试的想法吗?
答案 0 :(得分:0)
我遇到了类似的问题,我不确定原因,但我无法使用带有P-256曲线和SHA-256哈希算法的“椭圆曲线数字签名算法(ECDSA)”进行签名“,同时使用php
。因此,我尝试在ruby
上创建令牌,该令牌工作正常。
首先使用jwt
将gem install jwt
安装到您的语言环境,然后使用下面的脚本。
require 'jwt'
team_id = ''
client_id = ''
key_id = ''
ecdsa_key = ''
headers = {
'kid' => key_id
}
claims = {
'iss' => team_id,
'iat' => Time.now.to_i,
'exp' => Time.now.to_i + 86400*180,
'aud' => 'https://appleid.apple.com',
'sub' => client_id,
}
token = JWT.encode claims, ecdsa_key, 'ES256', headers
puts token
请注意,使用此脚本创建的令牌将在6个月后过期。您可以通过编辑exp
参数来更改此设置,但是6个月是Apple允许的上限。