相信大家都知道 Apple
规定,所有的APP
在6月30前要支持删除账号
的功能。并且开发者还收到了Apple
的邮件,里面提到了Revoke Token
的事情。
大致意思就是说,如果用Apple ID
登录了APP
,那么在删除账号的同时还需要解除Apple ID
的授权,也就是Apple
说的Revoke Token
。
这个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
。
- 1、进入
-
接下来,通过
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 -
这个接口有些是我们已经获取的,eg:
client_id
&client_secret
;这里只讲一下code
和grant_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'