cial Icons

Java ile Linkedin Authentication (JSF)

     
                Java ile Linkedin Authentication.Yaptığınız bir Web projesine (JSF) kullanıcıların Linkedin profilleri ile login olmalarını sağlayacağımız java kodlarını yazacağız. Projemize Linkedin ile login sağlayabilmek için önce linkedinden uygulama almanız gerekmektedir, buraya  bakarak uygulama oluşturabilirsiniz. Aldığınızı varsayarak devam ediyoruz. Kodun tamamını vererek satır aralarında anlatmayı tercih ediyorum:

Projeye eklenmiş 2 xhtml sayfası
Jsf projesi




       JSF projemize öncelikle 2 adet xhtml sayfası ekliyoruz.
Bunlardan birincisi login sayfamız ikincisi ise CallBack olarak vereceğimiz link olan xhtml sayfası
neden iki parça olduğunu ilerde anlayacaksınız o yüzden üzerinde durmuyorum.

Ayrıca projemizde scribe ve commons-codec jarlarına da ihtiyaç duyacağız fotoğrafta görüldüğü gibi ihtiyaç duyduğumuz jarları da ekledikten sonra projemize geçelim.

   buradan indirebilirsiniz: scribe      common-codec;










  login.java diye bir class ekleyip kodumuzu yazmaya başlıyoruz

login.java:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import java.io.IOException;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.scribe.builder.ServiceBuilder;
import org.scribe.builder.api.LinkedInApi;
import org.scribe.model.OAuthRequest;
import org.scribe.model.Response;
import org.scribe.model.Token;
import org.scribe.model.Verb;
import org.scribe.model.Verifier;
import org.scribe.oauth.OAuthService;

@ManagedBean(name = "login")
@SessionScoped
public class login {
 
 private OAuthService service; // Authenticate saglayan servisimiz
 private Token requestToken; // linkedin için istemci jetonu
 private ExternalContext externalContext;// linkedin sayfasına redirect yapmamız için external context
 
 public void LinkedRedirect(){
  service= new ServiceBuilder().provider(LinkedInApi.class).apiKey("İstemci Kimliğiniz")
    .apiSecret("İstemci Gizliliğiniz").callback("http://localhost:8080/linkedblog/faces/CallBack.xhtml").build();
  requestToken = service.getRequestToken();
  
  String AuthUrl=service.getAuthorizationUrl(requestToken);
  // authenticate sağlayacağımız url linkedin servisimizden istemci jetonu kullanılarak alınmakta
  // bu url email ve parolamızı girmemizi isteyecek olan url
    
  externalContext= FacesContext.getCurrentInstance().getExternalContext();
  
  try {
   externalContext.redirect(AuthUrl); // linkedin sayfasına redirect!
  } catch (IOException e) {
   System.out.println(e);
  }
 }
 
 public String Authenticated(){
  externalContext= FacesContext.getCurrentInstance().getExternalContext();
  Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
  String verifier=parameterMap.get("oauth_verifier");// linkedin girişi yaptıktan sonra linkedin bize bir gerçekleyici kodu vermekte 
  
  
  Verifier linkedVer=new Verifier(verifier);
  
  Token AccessToken= service.getAccessToken(requestToken, linkedVer); // istemci jetonu ve gerçekleyici kodumuzu kullanarak bir erişim jetonu alıyoruz :)
  
  OAuthRequest request = new OAuthRequest(Verb.GET,
    "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,headline,industry,email-address,site-standard-profile-request,picture-url)?format=json");
  // istemci kimliği belirliyoruz denilebilir linkedinden neler istediğimizi belirliyoruz
  
  service.signRequest(AccessToken, request); // iletişim jetonunu ve istemlerimizi bildiriyoruz denilebilir.
  Response resp= request.send();// yanıtımızı alıyoruz.
  String a=resp.getBody();
  System.out.println(a);
  return a;
 }

}


kodların işlevlerini elimden geldiğince açıklamaya çalıştım,    callback("http://localhost:8080/linkedblog/faces/CallBack.xhtml")  buradaki callback içine ikinci xhtml sayfasını veriyoruz kişi e-posta ve şifresini doğru girdiğinde bu sayfaya dönüş yapıyoruz.
Sıra geldi xhtml kodlarını ayarlamaya.

       Login xhtml sayfamız da action olarak login.LinkedRedirect() methodunu çağırdığımız bir commandlink yazıyoruz:




1
2
3
4
5
6
7
<div style=" margin:0 auto; width: 120px;">
    <h:commandLink action="#{login.LinkedRedirect()}"
     value="">
     <h:graphicImage value="/img/linkedin.png" style="height:30px;width:120px;margin-top:230px;">
     </h:graphicImage>
     </h:commandLink>
     </div>

ben linkedin png sini kullanarak bir button oluşturdum siz istediğiniz gibi yapabilirsiniz.

callback olarak verdiğiniz xhtml sayfasında ise String dönen bir method kullandığımızdan isterseniz body içinde #{login.Authenticated()} methodunu çağırabilirsiniz kendi amaçlarınız doğrultusunda istediğiniz gibi kullanabilirsiniz.

   İki parça halinde gerçekleştirdir çünkü öncelikle linkedinden url alıp bu urlde kullanıcıya login olmasını sağladıktan sonra diğer işlemlere geçilebilmektedir. Authenticate olunduktan sonrada kullanıcının bilgileri proje içeriğine göre çekilmektedir.

giriş sayfamız:
linkedin butonumuz
linkedin bağlantılı giriş sayfası



butonu tıkladığımızda:

linkedin kimliği
linkedin kimliği ile giriş
sonuç olarak dönen bilgiler :
{
  "firstName": "Umut",
  "headline": "Şu okulda öğrenci: İstanbul Üniversitesi",
  "id": "LRSgdB3KxD",
  "industry": "Computer Software",
  "lastName": "Coşkun",
  "pictureUrl": "https://media.licdn.com/mpr/mprx/0_yths_lBK2JBD-UqvpKAd_1bl2pPSt4qvOPqL_1XS1JbySyizrNrnDPK_Gt1PA0zMglGkuNn4-kLT",
  "siteStandardProfileRequest": {"url": "https://www.linkedin.com/profile/view?id=303599936&authType=name&authToken=ZMJD&trk=api*a4004223*s4072063*"}
}

bu linkten basic-profille hangi bilgileri çekebileceğinizi görebilirsiniz.

Elimden geldiğince açıklayarak anlatmaya çalıştım inşallah faydalı olmuştur.

5 yorum :

  1. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  2. güzel yazı , eline sağlık :)

    YanıtlaSil
  3. Güzel bir başlangıç olmuş :) eline sağlık. Yazılarının devamını bekleriz.

    YanıtlaSil
    Yanıtlar
    1. :) sağol Fuat abi benim temennim de o :) çok teşekkürler.

      Sil