Apple Revoke Token

相信大家都知道 Apple规定,所有的APP在6月30前要支持删除账号的功能。并且开发者还收到了Apple的邮件,里面提到了Revoke Token的事情。
大致意思就是说,如果用Apple ID登录了APP,那么在删除账号的同时还需要解除Apple ID的授权,也就是Apple说的Revoke Token

image
  • Revoke Tokens

    image

这个API其实是需要服务器去处理的。但是这里有些东西还是需要iOS 开发人员提供的。


Revoke Tokens参数解析

i HTTP Body

  • 这是在发送请求的时候要注意的Content-Type: application/x-www-form-urlencoded
form-data
The list of input parameters required for the server to invalidate the token.
Content-Type: application/x-www-form-urlencoded

ii client_id

  • 这个参数传Bundle Identifier就可以了

iii client_secret

  • 这个参数的获取就要复杂一些

  • Apple developer里面按下面的步骤生成一个p8文件

    • 1、进入 Certificates, Identifiers & Profiles > Keys,然后单击 Keys 旁边左上角的 + 号。
    • 2、提供密钥名称并确保勾选 Sign In with Apple。在这里,我们还必须单击 Configure。在接下来出现的 Configure Key 面板中,选择我们之前在 Choose a Primary App ID 下使用的 App ID,然后单击保存
    • 3、单击 Continue,然后在下一页中验证详细信息并单击 Register
    • 4、下载密钥并将其保存在安全的地方,因为您永远无法再次下载密钥。下载密钥后单击 Done
  • 接下来,通过Ruby 和 刚刚下载的p8文件,生成我们所需要的client_secret

    • 1、设置 Ruby 后运行命令 sudo gem install jwt 来设置 ruby-jwt

    • 2、通过文件编辑生成secret_gen.rb文件:

      require "jwt"
      key_file = "Path to the private key"
      team_id = "Your Team ID"
      client_id = "The Service ID of the service you created"
      key_id = "The Key ID of the private key"
      validity_period = 180 # In days. Max 180 (6 months) according to Apple docs.
      
      private_key = OpenSSL::PKey::EC.new IO.read key_file
      
      token = JWT.encode(
         {
            iss: team_id,
            iat: Time.now.to_i,
            exp: Time.now.to_i + 86400 * validity_period,
            aud: "https://appleid.apple.com",
            sub: client_id
         },
         private_key,
         "ES256",
         header_fields=
         {
            kid: key_id 
         }
      )
      puts token
      
      
    • 3、运行刚刚生成的rb文件:ruby secret_gen.rb,获取client_secret

iv token

  • 这个参数是通过另一个API接口去获取的:Generate and Validate Tokens

    image
  • 这个接口有些是我们已经获取的,eg:client_id & client_secret;这里只讲一下codegrant_type

    • code:这个是我们获取Apple授权的时候得到的,每次登录都会有。对应的是:authorizationCode
    • grant_type:这里就选authorization_code
  • 这样请求Generate and Validate Tokens之后,就会得到我们所需要的access_token,也就是token参数。

v token_type_hint

  • 这个就不用多说了,传access_token就好了。

对于iOS开发者来说,这些都不要在APP端操作,但是authorizationCode是一定要在认证的时候去获取,并传递给服务器的。


当请求完毕,返回200之后,我们再次使用A

@作者:Jax_YD 链接:https://www.jianshu.com/p/8061d924b2b6


在我调试的过程中,记录一下后端的逻辑,以PHP为例

1. 获取client_secret

        $clientId = 'com.testt.relaxme'; // APP的BUNDLE_ID
        $authCode = ' APP登录成功后获得的authorizationCode'; 
        $teamId = 'Team ID'; // Team ID
        $keyId = 'Key ID'; // Key ID
        $privateKeyFilePath = "pem格式私钥文件的路径"; 【可以转换为pem的私钥】
        // 使用私钥来生成client_secret
        $privateKey = openssl_pkey_get_private("file://$privateKeyFilePath");
        if (!$privateKey) {
            exit("Get private key failed");
        }
        $payload = [
            'iss' => $teamId,
            'iat' => time(),
            'exp' => time() + 86400,
            'aud' => 'https://appleid.apple.com',
            'sub' => $clientId,
        ];
        $clientSecret = JWT::encode($payload, $privateKey, 'ES256', $keyId);

2.调用苹果接口验证authorizationCode

        $postParams = [
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
            'code' => $authCode,
            'grant_type' => 'authorization_code',
        ];

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => 'https://appleid.apple.com/auth/token',
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => false,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query($postParams),
        ]);
        $response = curl_exec($ch);

        #可参考以下结果
        {
            "access_token": "一个token,此处省略",
            "token_type": "Bearer",
            "expires_in": 3600,
            "refresh_token": "一个token,此处省略",
            "id_token": "结果是JWT,字符串形式,此处省略"
        }

        //示例:
        {
          "access_token": "ac6dd62539f5441cdacd7b548a9fe33a9.0.nrszq.gCD9GEmcznYjt5m3h4UkEg",
          "token_type": "Bearer",
          "expires_in": 3600,
          "refresh_token": "r9f10xxxxxxxxxxxe80e.0.nxxxxq.fk7Q1ZxxxxxxxxxM0w",
          "id_token": "eyJraWQiOiJlWGF1bm1MIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLnpvZnVuZC5xaWFuZ3VuZ3VuIiwiZXhwIjoxNTgzMTMxNzI1LCJpYXQiOjE1ODMxMzExMjUsInN1YiI6IjAwMTI5MC44MDYzZGRmODMwYjI0YTQ5OTc4OTZhNmUxOGNmMjE5Yi4xMDEzIiwiYXRfaGFzaCI6IjBrU05fMzlkcGxhUEdnMUd0YV9Ka1EiLCJlbWFpbCI6InJlZXM5cGd3NWJAcHJpdmF0ZXJlbGF5LmFwcGxlaWQuY29tIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiaXNfcHJpdmF0ZV9lbWFpbCI6InRydWUiLCJhdXRoX3RpbWUiOjE1ODMxMzEwOTV9.p19sc-tjsNQNCXyb33AX9r4oXj1xA4EmKh9Yp5E5ImxnOe6n_ISqvgMyDGqOuZwLAP9iMfB4-S_--1dpuzPx4HtwOyygpHhZSEZ4GcynCpHg6MFC7Mlkcn34J_awEXPeox_nJMRPRMN-ydQ7GxLvSrEJPJ-1rL473pIBc-DyNdYjkXcuyVU4FN6nEuh2NrOKCzMjkeEDqSmL2nG_TM7qE7JscAOcI6Nv5oml2KkYMeQl24kopQa2rC3m8HSsYSdaPs04pdiFEF20Fl3RqR-cnE0UeTmlC4KaBRF4xGpPpNT-OKvW2P6yUrkHmS27Mt1vM1sJkCiKMUGO3_i0Ef7ghA"
}

3.开始Revoke tokens 传送门

curl -v POST "https://appleid.apple.com/auth/revoke" \
-H 'content-type: application/x-www-form-urlencoded' \
-d 'client_id=CLIENT_ID' \
-d 'client_secret=CLIENT_SECRET' \
-d 'token=ACCESS_TOKEN' \
-d 'token_type_hint=access_token'

你可能感兴趣的:(Apple Revoke Token)