Dist is correct.
For user authentication you need to redirect the user to Twitch.
But you shouldn’t be doing user authentication here. The error returned is what you get when trying to do things wrong
You need to be generating a client credentials token as outline here
Full example that chains to a streams lookup, this is semi suitable for a Cron Job. Change the // stream is live and not live lines to relevant DB writing calls.
<?php
define("CLIENT_ID", "");
define("CLIENT_SECRET", "");
define('STREAMER_ID', '');
$keys = false;
if (file_exists(__DIR__ . '/auth.json')) {
$keys = json_decode(file_get_contents(__DIR__ . '/auth.json'));
}
$generate_token = true;
if ($keys) {
// validate the token
$ch = curl_init('https://id.twitch.tv/oauth2/validate');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer ' . $keys->access_token
));
$r = curl_exec($ch);
$i = curl_getinfo($ch);
curl_close($ch);
if ($i['http_code'] == 200) {
// the token appears good
$generate_token = false;
// optional to check the expires
$data = json_decode($r);
if (json_last_error() == JSON_ERROR_NONE) {
if ($data->expires_in < 3600) {
// less than an hour left
// make a new token
echo 'Token close to expire. Regenerate';
$generate_token = true;
}
} else {
echo 'Failed to parse JSON. Assume dead token';
$generate_token = true;
}
}
}
if ($generate_token) {
$ch = curl_init('https://id.twitch.tv/oauth2/token');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'client_id' => CLIENT_ID,
'client_secret' => CLIENT_SECRET,
'grant_type' => "client_credentials"
));
$r = curl_exec($ch);
$i = curl_getinfo($ch);
curl_close($ch);
if ($i['http_code'] == 200) {
$keys = json_decode($r);
if (json_last_error() == JSON_ERROR_NONE) {
// store the token for next run
file_put_contents(__DIR__ . '/auth.json', $r);
} else {
echo 'Failed to parse JSON';
}
} else {
echo 'Failed with ' . $i['http_code'] . ' ' . $r;
exit;
}
}
$ch = curl_init('https://api.twitch.tv/helix/streams?user_id='.STREAMER_ID);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Client-ID ' . CLIENT_ID,
'Authorization: Bearer ' . $keys->access_token
));
$r = curl_exec($ch);
$i = curl_getinfo($ch);
curl_close($ch);
if ($i['http_code'] == 200) {
$data = json_decode($r);
if ($data->data && $data->data[0]) {
// stream is live
} else {
// stream is not live
}
} else {
echo 'Failed to get streams ' . $i['http_code'] . ' ' . $r;
}