[英]FB social Login PHP - Why People take it as so difficult?
我在基於PHP的網站上實現FB social
登錄。 我檢查了FB網站,發現它易於實施。 以下是我所遵循的方法,不確定在此是否存在任何安全問題 。
我使用了Facebook JS SDK方法。
如下:
var appID = 'xxxxxxxxxxxxxxx';
window.fbAsyncInit = function() {
FB.init({
appId : appID, // App ID
channelUrl : '',
status : true,
cookie : true,
xfbml : true,
});
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
// connected
FB.api('/me?fields=id,name,email,permissions', function(response) {
//alert('Good to see you, ' + response.name + '.');
});
}else{
}
});
};
function login() {
if( navigator.userAgent.match('CriOS') ){
}
else{
FB.login(function(response) {
if (response.authResponse) {
replace_login();
} else {
// cancelled
alert('User cancelled login or did not fully authorize.');
}
},{scope: 'email,public_profile,user_friends'});
}
}
function replace_login(){
FB.api('/me?fields=id,name,email', function(response) {
$.ajax({
url: "s-account",
type: 'POST',
data: response,
dataType: 'json',
beforeSend: function(){
$("#signin_fb").button('loading');
},
success: function(data) {
$("#signin_fb").button('reset');
window.location.reload();
},
error: function(){
$("#signin_fb").button('reset');
}
});
});
}
在服務器端的PHP中,我通過ajax調用將用戶詳細信息(如social_id, name and email
在數據庫中,並且如果數據庫操作成功,則將在username and email
設置Session Variable
,並且用戶已成功登錄。
對於注銷,我正在使用自己的注銷功能銷毀網站用戶會話,並且用戶已成功注銷。
現在,安全風險在哪里? 因為如果用戶注銷,然后嘗試再次登錄,則JS SDK將通過新的響應獲得新的訪問令牌。
這整個身份驗證過程歸結為對s-account
的ajax調用。 您是在POST請求中將 名稱和電子郵件從FB.api()發送到您的后端應用程序,並且您沒有提到,我想您沒有在服務器端使用這些詳細信息驗證訪問令牌,並且僅根據這些詳細信息進行會話。
安全問題
現在,安全性問題是您在服務器端使用了客戶端身份驗證。 用戶可以簡單地生成一個POST請求以使用諸如用戶名和電子郵件地址之類的虛假響應(例如Facebook)生成s-account
,您的PHP應用程序將對用戶進行身份驗證並進行有效會話,而無需驗證詳細信息是否來自合法來源。 您的身份驗證已在此階段完全中斷,因為惡意用戶可以通過生成一個簡單的POST請求來使用任何電子郵件和用戶名 s-account
使用任何s-account
登錄 。
怎么修
Facebook在圖譜API中提供一個端點,該端點可驗證訪問令牌並返回與此訪問令牌關聯的用戶的詳細信息。 從文檔中 :
該端點返回有關給定訪問令牌的元數據。 這包括數據,例如為其頒發令牌的用戶,令牌是否仍然有效,令牌何時到期以及應用程序對給定用戶具有哪些權限。
Fb.Login()將生成訪問令牌作為response.authResponse.accessToken
和userId作為response.authResponse.userID
。 您需要在對s-account
ajax調用中將此accessToken
和userID
以及其他用戶詳細信息一起發送,然后使用以下API端點來驗證這些詳細信息是否合法。
curl -X GET "https://graph.facebook.com/v2.6/debug_token?input_token=USER_ACCESS_TOKEN_FROM_AJAX_CALL&access_token=YOUR_APP_ACCESS_TOKEN"
如果訪問令牌有效,則您將獲得以下響應,其中包含為其發出該令牌的用戶ID。
{
"data": {
"app_id": "YOUR_APP_ID",
"application": "YOUR_APP_NAME",
"expires_at": 1462777200,
"is_valid": true,
"scopes": [
"email",
"manage_pages",
"pages_messaging",
"pages_messaging_phone_number",
"public_profile"
],
"user_id": "THE_USER_ID_ASSOCIATED_WITH_THE_TOKEN"
}
}
現在,您可以將此userID
與在ajax調用中收到的用戶ID進行比較,並檢查詳細信息是否合法。
如何獲取您的APP_ACCESS_TOKEN
要使用debug_token API調試用戶訪問令牌,您需要使用以下API端點在服務器端生成APP訪問令牌。
curl -X GET "https://graph.facebook.com/v2.6/oauth/access_token?client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&grant_type=client_credentials"
這將返回您的應用訪問令牌作為響應。
{
"access_token": "YOUR_APP_ACCESS_TOKEN_HERE",
"token_type": "bearer"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.