Flo*_*ian 5 php apple-music sign-in-with-apple apple-musickit-js
我正在尝试创建一个网络服务,从用户的 Apple 帐户中获取姓名和电子邮件,并将歌曲或艺术家放入他的库中。
为了将歌曲添加到库中,我找到了这个apple-music-api。图书馆。要代表用户发出请求,您需要使用Apple MusicKit JS库请求用户令牌。
为了获取用户的姓名和电子邮件,我使用了这个oauth2 客户端,该客户端使用Apple功能进行登录。
A使用苹果音乐套件...我无法查询任何用户个人资料数据。至少我似乎找不到这个例子或任何文档。是否有可能使用此路由获取用户电子邮件和姓名?
B使用“使用 Apple 登录”oauth 流程,我收到一个包含姓名和电子邮件的访问令牌。但我无法使用令牌来查询苹果音乐 api。他们的范围似乎仅限于名称和电子邮件......并且音乐 api 或相关的范围似乎不存在。是否有可能获得可在音乐 api 上使用的用户令牌?
C是否有任何其他可能性可以实现此目的,而不需要用户在苹果上登录两次(一次用于电子邮件,一次用于将歌曲推送到他的库)
// $leeway is needed for clock skew
Firebase\JWT\JWT::$leeway = 60;
$provider = new League\OAuth2\Client\Provider\Apple([
'clientId' => 'com.myapp.www',
'teamId' => 'team.id', // 1A234BFK46 https://developer.apple.com/account/#/membership/ (Team ID)
'keyFileId' => 'key.id', // 1ABC6523AA https://developer.apple.com/account/resources/authkeys/list (Key ID)
'keyFilePath' => dirname(__FILE__) . '/AuthKey_key.id.p8', // __DIR__ . '/AuthKey_1ABC6523AA.p8' -> Download key above
'redirectUri' => PLUGIN_URL . 'callback-apple-music.php',
]);
if (isset($_POST['code'])) {
if (empty($_POST['state']) || !isset($_COOKIE['apple-oauth2state']) || ($_POST['state'] !== $_SESSION['apple-oauth2state'])) {
unset($_COOKIE['apple-oauth2state']);
exit('Invalid state');
} else {
try {
// Try to get an access token (using the authorization code grant) via signin_with_apple
/** @var AppleAccessToken $token */
$token = $provider->getAccessToken('authorization_code', [
'code' => $_POST['code']
]);
$access_token = $token->getToken();
// create an client for api.music.apple
$tokenGenerator = new PouleR\AppleMusicAPI\AppleMusicAPITokenGenerator();
$jwtToken = $tokenGenerator->generateDeveloperToken(
'team.id',
'key.id',
dirname(__FILE__) .'/AuthKey_key.id.p8'
);
// create a developer token again
$curl = new \Symfony\Component\HttpClient\CurlHttpClient();
$client = new PouleR\AppleMusicAPI\APIClient($curl);
$client->setDeveloperToken($jwtToken);
$api = new PouleR\AppleMusicAPI\AppleMusicAPI($client);
$api->setMusicUserToken($access_token);
// This endpoint needs authorisation
$result = $api->getAllLibraryPlaylists(); //https://api.music.apple.com/v1/me/library/playlists?offset=0&limit=25
echo '<pre>';
print_r($result);
echo '</pre>';
// wp_redirect($redirect_url);
exit;
} catch (Exception $e) {
echo '<pre>';
print_r($e);
echo '</pre>';
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题的问题在于这是三个问题 - 并且没有告诉哪个客户。
最常见的“登录方式”仅适用于创建本地帐户而无需太多输入。
oAuth2 的范围非常有限,这很可能是有意为之。
我查了一下……需要一个“音乐用户令牌”:
https: //developer.apple.com/documentation/applemusicapi/getting_keys_and_creating_tokens
并且此令牌需要作为 HTTP 标头传递:'Music-User-Token: [music user token]'。
这意味着,用户令牌可能源自 iOS 设备(您需要公开 REST API,以便可以将其发布,然后由 PHP 在服务器端用作 HTTP 标头):https ://developer.apple.com/documentation/storekit/skcloudservicecontroller/2909079-requestusertoken(这只需要登录您自己的API)。
在客户端(浏览器)上运行 Apple MusicKit JS 时,可能无法避免两次登录: https ://developer.apple.com/documentation/musickitjs/musickit/musickitinstance/2992701-authorize
在同一个方法中使用这两个流程是没有意义的
(这也忽略了单一职责的原则)。
| 归档时间: |
|
| 查看次数: |
1360 次 |
| 最近记录: |