我正在尝试允许用户使用Twitch API登录,但我的代码存在一些问题。该代码由BarryCarlyon编写,并从此论坛https://discuss.dev.twitch.tv/t/authorization-code-flow/5148/12复制。
我对Twitch API并不熟悉,而且我的PHP知识只是到目前为止。我认为问题发生在if ($i['http_code'] == 200)
或该地区的某个地方:
if ($i['http_code'] == 200) {
$result = json_decode($result, true);
// get
$curl = curl_init('https://api.twitch.tv/kraken/user');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Accept: application/vnd.twitchtv.v3+json',
'Client-ID: ' . $client_id,
'Authorization: OAuth ' . $result['access_token']
));
$user = curl_exec($curl);
$i = curl_getinfo($curl);
curl_close($curl);
if ($i['http_code'] == 200) {
$user = json_decode($user);
echo '<p>Thanks ' . $user->display_name . ' <3</p>';
// THE USER IS LOGGED IN
} else {
echo '<p>An error occured, please <a href="/">click here and try again</a></p>';
}
完整代码:
$client_id = 'YourID';
$client_secret = 'YourSecret';
$redirect_uri = 'http://someplace/';
if ($_GET['code']) {
$token_url = 'https://api.twitch.tv/kraken/oauth2/token';
$data = array(
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'authorization_code',
'redirect_uri' => $redirect_uri,
'code' => $_GET['code']
);
$curl = curl_init($token_url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
$i = curl_getinfo($curl);
curl_close($curl);
if ($i['http_code'] == 200) {
$result = json_decode($result, true);
// get
$curl = curl_init('https://api.twitch.tv/kraken/user');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Accept: application/vnd.twitchtv.v3+json',
'Client-ID: ' . $client_id,
'Authorization: OAuth ' . $result['access_token']
));
$user = curl_exec($curl);
$i = curl_getinfo($curl);
curl_close($curl);
if ($i['http_code'] == 200) {
$user = json_decode($user);
echo '<p>Thanks ' . $user->display_name . ' <3</p>';
// THE USER IS LOGGED IN
} else {
echo '<p>An error occured, please <a href="/">click here and try again</a></p>';
}
} else {
echo '<p>An error occured, please <a href="/">click here and try again</a></p>';
}
} else {
$scopes = array(
'user_read' => 1,
);
$req_scope = '';
foreach ($scopes as $scope => $allow) {
if ($allow) {
$req_scope .= $scope . '+';
}
}
$req_scope = substr($req_scope, 0, -1);
$auth_url = 'https://api.twitch.tv/kraken/oauth2/authorize?response_type=code';
$auth_url .= '&client_id=' . $client_id;
$auth_url .= '&redirect_uri=' . $redirect_uri;
$auth_url .= '&scope=' . $req_scope;
$auth_url .= '&force_verify=true';
echo '<a href="' . $auth_url . '">Please Click this Link to Authenticate with Twitch</a>';
}
答案 0 :(得分:1)
我猜你在本地运行此代码,而你的问题源于此。我自己在本地运行,我看到以下问题:
SSL certificate problem: self signed certificate in certificate chain
您可以使用curl_error()
检查错误,如下所示:
$result = curl_exec($curl);
if (curl_error($curl))
{
echo curl_error($curl);
}
出于严格的本地调试和测试目的(我强调这一点),您可以通过curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
禁用此检查。不要使用生产中运行的代码执行此操作。了解更多关于这个具体问题:Curl error 60, SSL certificate prðblem: self signed certificate in certificate chain
因此,假设您只想继续在本地运行以进行测试(仅重点关注本地测试),您可以继续并禁用SSL验证。
第一部分改为:
$token_url = 'https://api.twitch.tv/kraken/oauth2/token';
$data = array(
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'authorization_code',
'redirect_uri' => $redirect_uri,
'code' => $_GET['code']
);
$curl = curl_init($token_url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // Disables SSL verification
$result = curl_exec($curl);
第二部分更改为:
$curl = curl_init('https://api.twitch.tv/kraken/user');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // Disables SSL verification
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Accept: application/vnd.twitchtv.v3+json',
'Client-ID: ' . $client_id,
'Authorization: OAuth ' . $result['access_token']
));
$user = curl_exec($curl);
更正确的解决方案是为PHP安装设置CA根证书。我之前链接的问题提供了执行此操作的步骤。