İpucu

Facebook Hesabı İle Sitenize Giriş Yapılabilmesini Sağlama

Bazı web sitelerinde Facebook ile giriş yap, Google ile giriş yap gibi düğmeler görebilirsiniz. Bu siteler Facebook abonelerini kolay bir şekilde giriş yapmasıını sağlayarak kullanıcıları kayıt yükünden kurtarmaktadır.
Öncelikle Facebook'da bir developer hesabı almak gerekir : developers.facebook.com
İlk iş olarak bir App yaratılması gerekir. App yaratıldıktan sonra Facebook Login yaratılabilir.
İkinci işlem olarak Facebook ile Giriş yap düğmesi sayfanıza eklenmesi gerekir. Aşağıdaki bölüm header bölümüne eklenebilir. Bu facebook ile ilgili araçları kullanmak için gereklidir.
<script>
	  window.fbAsyncInit = function() {
	    FB.init({
	      appId      : '692669434443081',
	      cookie     : true,
	      xfbml      : true,
	      version    : 'v3.1'
	    });	      
	    FB.AppEvents.logPageView();	      
	  };
	
	  (function(d, s, id){
	     var js, fjs = d.getElementsByTagName(s)[0];
	     if (d.getElementById(id)) {return;}
	     js = d.createElement(s); js.id = id;
	     js.src = "https://connect.facebook.net/en_US/sdk.js";
	     fjs.parentNode.insertBefore(js, fjs);
	   }(document, 'script', 'facebook-jssdk'));
	</script>
Ardından düğmenin kendisi eklenir
<fb:login-button size="large"
		scope="public_profile,email"
	onlogin="checkLoginState();">
	<span style= "margin-right: 10px;">Facebook</span>
</fb:login-button>
Burada JSF kullanıldığı için fb namsepace'i xmlns:fb="http://www.facebook.com/2008/fbml" şeklinde eklenmiştir.
Eğer üye zaten loginli ise işlemi başarılı olur ver checkLoginState yöntemi çağrılır. Kullanıcı bu durumda giriş ekranını görmesine dahi gerek yoktur. Eğer Facebook'a daha önce giriş yapmadıysa Facebook giriş ekranı açılır.
<script>
function statusChangeCallback(response) {
	if (response.status === 'connected') {
		FB.api('/me', {fields:'id,name,email'}, function(meResponse) {
		  var xhr = new XMLHttpRequest();
		  xhr.open('POST', '#{request.contextPath}/FacebookTokenSigninServlet');
		  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		  xhr.onload = function() {
			  if(xhr.status==200){
				location.href="/";
			  }
		  };
		  xhr.send('token=' + response.authResponse.accessToken
				  +'&amp;userID='+response.authResponse.userID
				  +'&amp;email='+meResponse.email
				  +'&amp;name='+meResponse.name);		
		});	  
	}
}
</script>
<script type="text/javascript">
	function checkLoginState() {
	  FB.getLoginStatus(function(response) {
		statusChangeCallback(response);
	  });
	}
</script>
Eğer işlem başarılı olursa FacebookTokenSigninServletadında bir Servlet çağrılır. Bu Servlet kullanıcının mail adresi vb.. bilgilerini alan ve giriş yapan, eğer üye değilse kayıt yapan servlettir.
@WebServlet("/FacebookTokenSigninServlet")
public class FacebookTokenSigninServlet extends HttpServlet {
	private String CLIENT_ID = "1047450979973-rqpakuc4ekv7a79enedssgtpahcjo8ds.apps.googleusercontent.com";
	public FacebookTokenSigninServlet() {
		super();
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String token = request.getParameter("token");
		String userID = request.getParameter("userID");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		if(token==null || token.isEmpty() || userID==null || userID.isEmpty()){
			System.out.println("Invalid facebook ID token.");
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		
		if(email==null || email.isEmpty()){
			System.out.println("Invalid facebook ID token.");
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		
		// GET appToken from appLink
		String accessToken = getAccessToken(token);
		if(accessToken==null){
			System.out.println("access token is null");
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		
		boolean validate=validate(token, accessToken, userID);
		if(!validate){
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
				
		try {
			
			// üye mi değil mi kontrol ediliyor email adresine gore.
			// üye değilse kayıt ediliyor. Üye ise sadece login yapılıyor
			
			response.setStatus(HttpServletResponse.SC_OK);
			return;
			
		} catch (DatabaseException e) {
			e.printStackTrace();
			response.setStatus(HttpServletResponse.SC_BAD_GATEWAY);
			return;
		}
				
	}
	
	private String getAccessToken(String token) throws ClientProtocolException, IOException{
		
		String appLink = 
				"https://graph.facebook.com/oauth/access_token?"
				+ "client_id=692669434443081&client_secret=123456&"
				+ "grant_type=client_credentials";
		
		String accessToken  = null;
		DefaultHttpClient httpclient = new DefaultHttpClient();
		try {
			HttpGet httpget = new HttpGet(appLink);
			ResponseHandler<String> responseHandler = new BasicResponseHandler();
			String responseBody = httpclient.execute(httpget, responseHandler);
			JsonParser parser = new JsonParser();
			JsonObject json = parser.parse(responseBody).getAsJsonObject();
			return json.get("access_token").getAsString();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			httpclient.getConnectionManager().shutdown();
		}
		return accessToken;
		
	}
	
	private boolean validate(String token, String accessToken, String userID) {
		
		String link = "https://graph.facebook.com/debug_token?input_token="
 +  token + "&access_token=" + URLEncoder.encode(accessToken);
		
		DefaultHttpClient httpclient = new DefaultHttpClient();
		try {
			HttpGet httpget = new HttpGet(link);
			ResponseHandler<String> responseHandler = new BasicResponseHandler();
			String responseBody = httpclient.execute(httpget, responseHandler);
			
			Map map=getGraphData(responseBody);
			
			if(map.get("user_id").equals(userID)){
				return true;
			}
			
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			httpclient.getConnectionManager().shutdown();
		}
		
		return false;
		
	}
	private Map getGraphData(String fbGraph) {
		
		Map fbProfile = new HashMap();
			
		JsonParser parser = new JsonParser();
		JsonObject json = parser.parse(fbGraph).getAsJsonObject();
		
		JsonObject data=(JsonObject)json.get("data");
		
		fbProfile.put("user_id", data.get("user_id").getAsString());
		
		if(json.has("first_name")){
			fbProfile.put("first_name", json.get("first_name").getAsString());
		}
		if(json.has("last_name")){
			fbProfile.put("last_name", json.get("last_name").getAsString());
		}
		if (json.has("email")){
			fbProfile.put("email", json.get("email").getAsString());
		}
		return fbProfile;
	}
}
zafer.teker , 07.05.2020

Bu Sayfayı Paylaş:

Fibiler Üyelerinin Yorumları


Tüm üyeler içeriklere yorum ekleyerek katkıda bulunabilir : Yorum Gir

Misafir Yorumları




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir