与Apple后端集成后端登录

时间:2019-10-07 14:11:07

标签: php swift jwt

我正在尝试构建一个简单的后端来支持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"}。 即使我提供一个随机字符串作为“代码”,我也会遇到同样的错误,这就是为什么我认为这可能是如何生成此代码的问题,但我不确定。

有人有我可以尝试的想法吗?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我不确定原因,但我无法使用带有P-256曲线和SHA-256哈希算法的“椭圆曲线数字签名算法(ECDSA)”进行签名“,同时使用php。因此,我尝试在ruby上创建令牌,该令牌工作正常。

首先使用jwtgem 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允许的上限。