國外登陸太坑了,都是一點點總結到這裏作個記錄。服務端驗證登陸國外登陸的前提是有一臺服務器在國外或者配置國外服務器代理,此方直接代理到香港服務器請求。
目前收到幾個google, facebook, twitter服務端登陸,不提現客戶端實現。簡要的貼部分PHP代碼參考,其餘語言互通
- 首先客戶端受權獲取idToken,服務端獲得這個受權後直接請求google進行驗證
- 請求https://oauth2.googleapis.com...{idToken}
- 獲得用戶的信息進行本身業務的操做
- 參考:https://developers.google.com...
- 首先是客戶端受權獲取獲得accessToken、faceBookId
- 請求https://graph.facebook.com/{faceBookId}?access_token={access_token}&fields=id,picture,name"
- 獲得用戶信息和客戶端的faceBookId進行對比
- 進行本身業務
- 參考:https://blog.csdn.net/mycwq/a... 裏面的請求地址須要注意
- twitter就比較麻煩了
- 先用postman進行測試,twitter採用OAuth1.0
Consumer Key 和 Consumer Secret 去管理平臺獲取
Access Token 和 Token Secret 客戶端受權得到
Signature Method 固定值 HMAC-SHA1
Timestamp 時間搓
Nonce 隨機數
Version 固定1.0

- 前面只是測試階段配置是否正確,下面貼PHP代碼:
<?php
//Twitter配置,管理後臺查
$consumerKey = '';
$consumerSecret = '';
//加密算法,本身百度回來的,
function get_signature($str, $key){
$signature = "";
if (function_exists('hash_hmac')){
return base64_encode(hash_hmac("sha1", $str, $key, true));
} else {
//這裏不解釋,若是不支持,本身百度了
}
return $signature;
}
$time = time();
$oauth_consumer_key = $consumerKey;
$oauth_nonce= time() . rand();
$oauth_signature_method="HMAC-SHA1";
$oauth_timestamp=$time;
$oauth_version="1.0";
//請求方法,必需所有大寫。
$httpMethod = 'GET';
//客戶端獲取的兩個值
$input_token = "";
$input_token_sec = "";
//url,必需所有小寫
$url = 'https://api.twitter.com/1.1/account/verify_credentials.json';
$params = [
'oauth_consumer_key' => $oauth_consumer_key,
'oauth_nonce' => $oauth_nonce,
'oauth_signature_method' => $oauth_signature_method,
'oauth_timestamp' => $oauth_timestamp,
'oauth_version' => $oauth_version,
'oauth_token' => $input_token
];
ksort($params);
$params = http_build_query($params);
//參數,這次請求中的除了oauth_signature之外的全部參數按照字母順序升序排列,若是參數名相同,那麼按照參數值的字母順序升序排列。
// $params = "oauth_consumer_key={$oauth_consumer_key}&oauth_nonce={$oauth_nonce}&oauth_signature_method={$oauth_signature_method}&oauth_timestamp={$oauth_timestamp}&oauth_version={$oauth_version}";
//簽名串(text)的構成:HttpMethod&url&參數。(必定是先各自urlencode後再用‘&’相連起來)
$signature_text = urlencode($httpMethod) . '&' . urlencode($url) . '&' . urlencode($params);
//oauth_consumer_secret&oauth_token_secret
$key = $consumerSecret . '&' . $input_token_sec;
$oauth_signature = get_signature($signature_text, $key);
// echo $oauth_signature . '<p>';
$oauth_signature = urlencode($oauth_signature);
//echo $oauth_signature . "</p>";
$httpHeader = [
'Authorization: OAuth ' .
'oauth_consumer_key='.$oauth_consumer_key .
',oauth_token='. $input_token.
',oauth_signature_method='.$oauth_signature_method .
',oauth_timestamp='.$oauth_timestamp .
',oauth_nonce='. $oauth_nonce .
',oauth_version='.$oauth_version .
',oauth_signature='.$oauth_signature
];
// echo $httpHeader[0];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//本身設置代理
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1');
curl_setopt($ch, CURLOPT_PROXYPORT, 1087);
$ret = curl_exec($ch);
if (false === $ret) {
$ret = curl_errno($ch);
}
curl_close($ch);
echo $ret;