2012-07-11 36 views
6

Làm cách nào để triển khai phương pháp đăng nhập cho Linkedin, vì vậy mọi người chỉ cần nhấp vào nút và sử dụng tài khoản Linkedin của họ để đăng nhập, giống như trên Facebook hoặc Twitter? Cả hai đều sử dụng OAuth, nhưng tôi đã tìm thấy các thư viện được chỉ định cho các thư viện đã chết đơn giản để sử dụng. Đối với Linkedin tôi chỉ tìm thấy một số mã mẫu trong DotNetOpenAuth nhưng tôi không thể làm cho bất kỳ ý nghĩa nào về nó.Đăng nhập với Linkedin

Có thư viện nào tôi có thể sử dụng để tạo điều kiện cho chức năng đăng nhập cho Linkedin không? Hoặc bất kỳ hướng dẫn về cách làm điều đó trong ASP.NET MVC với DotNetOpenAuth 4?

+0

Tôi chưa từng can thiệp với OAuth, chứ không phải đọc nhiều hơn về nó. Tuy nhiên, tôi đã làm một google nhanh chóng và tìm thấy trang này trên linkedin: https://developer.linkedin.com/documents/quick-start-guide Theo như tôi có thể nói điều này + DotNetOpenAuth nên thực hiện công việc. (Tôi không viết câu trả lời vì tôi cảm thấy mình không chắc chắn 100% mình ở đây và tôi chưa có kinh nghiệm thực tế về chủ đề này :)) – Onkelborg

+0

@Onkelborg, tôi thấy rằng , nhưng DNOA rất phức tạp đối với OAuth và các mẫu cũ. Tồi tệ hơn, chúng được lấp đầy với mã WebForms và cấu trúc dữ liệu tùy chỉnh, điều này làm cho nó khó hiểu hơn nhiều. – CMircea

Trả lời

4

Đây là những gì có vẻ là một mẫu khá rắn

http://mrsarker.wordpress.com/2011/08/20/linkedin-rest-api-in-asp-net-mvc/

[HandleError] 
public class LinkedInController : Controller 
{ 
    public ActionResult index() 
    { 
     return AuthenticateToLinkedIn(); 
    } 

    static string token_secret = ""; 
    public ActionResult AuthenticateToLinkedIn() 
    { 
     var credentials = new OAuthCredentials 
     { 
      CallbackUrl = "http://localhost/home/callback", 
      ConsumerKey = ConfigurationManager.AppSettings["ConsumerKey"], 
      ConsumerSecret = ConfigurationManager.AppSettings["ConsumerSecret"], 
      Verifier = "123456", 
      Type = OAuthType.RequestToken 
     }; 

     var client = new RestClient { Authority = "https://api.linkedin.com/uas/oauth", Credentials = credentials }; 
     var request = new RestRequest { Path = "requestToken" }; 
     RestResponse response = client.Request(request); 

     token = response.Content.Split('&').Where(s => s.StartsWith("oauth_token=")).Single().Split('=')[1]; 
     token_secret = response.Content.Split('&').Where(s => s.StartsWith("oauth_token_secret=")).Single().Split('=')[1]; 
     Response.Redirect("https://api.linkedin.com/uas/oauth/authorize?oauth_token=" + token); 
     return null; 
    } 

    string token = ""; 
    string verifier = ""; 
    public ActionResult Callback() 
    { 
     token = Request["oauth_token"]; 
     verifier = Request["oauth_verifier"]; 
     var credentials = new OAuthCredentials 
     { 
      ConsumerKey = ConfigurationManager.AppSettings["ConsumerKey"], 
      ConsumerSecret = ConfigurationManager.AppSettings["ConsumerSecret"], 
      Token = token, 
      TokenSecret = token_secret, 
      Verifier = verifier, 
      Type = OAuthType.AccessToken, 
      ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, 
      SignatureMethod = OAuthSignatureMethod.HmacSha1, 
      Version = "1.0" 
     }; 

     var client = new RestClient { Authority = "https://api.linkedin.com/uas/oauth", Credentials = credentials, Method = WebMethod.Post }; 
     var request = new RestRequest { Path = "accessToken" }; 
     RestResponse response = client.Request(request); 
     string content = response.Content; 


     string accessToken = response.Content.Split('&').Where(s => s.StartsWith("oauth_token=")).Single().Split('=')[1]; 
     string accessTokenSecret = response.Content.Split('&').Where(s => s.StartsWith("oauth_token_secret=")).Single().Split('=')[1]; 

     var company = new LinkedInService(accessToken, accessTokenSecret).GetCompany(162479);    

     // Some commented call to API 
     //company = new LinkedInService(accessToken, accessTokenSecret).GetCompanyByUniversalName("linkedin"); 
     // var companies = new LinkedInService(accessToken, accessTokenSecret).GetCompaniesByEmailDomain("apple.com");    
     // var companies1 = new LinkedInService(accessToken, accessTokenSecret).GetCompaniesByEmailDomain("linkedin.com");   
     // var companies2= new LinkedInService(accessToken, accessTokenSecret).GetCompaniesByIdAnduniversalName("162479", "linkedin"); 
     //var people = new LinkedInService(accessToken, accessTokenSecret).GetPersonById("f7cp5sKscd"); 
     //var people = new LinkedInService(accessToken, accessTokenSecret).GetCurrentUser(); 

     //string url = Url.Encode("http://bd.linkedin.com/pub/rakibul-islam/37/522/653"); 
     //var people = new LinkedInService(accessToken, accessTokenSecret).GetPeoPleByPublicProfileUrl(url); 
     //var peopleSearchresult = new LinkedInService(accessToken, accessTokenSecret).SearchPeopleByKeyWord("Princes"); 

     var peopleSearchresult = new LinkedInService(accessToken, accessTokenSecret).GetPeopleByFirstName("Mizan"); 
     String companyName = company.Name; 
     return Content(companyName);    
    } 
} 


public class LinkedInService 
{ 
    private const string URL_BASE = "http://api.linkedin.com/v1"; 
    public static string ConsumerKey { get { return ConfigurationManager.AppSettings["ConsumerKey"]; } } 
    public static string ConsumerKeySecret { get { return ConfigurationManager.AppSettings["ConsumerSecret"]; } } 
    public string AccessToken { get; set; } 
    public string AccessTokenSecret { get; set; } 

    public LinkedInService(string accessToken, string accessTokenSecret) 
    { 
     this.AccessToken = accessToken; 
     this.AccessTokenSecret = accessTokenSecret; 
    } 

    private OAuthCredentials AccessCredentials 
    { 
     get 
     { 
      return new OAuthCredentials 
      { 
       Type = OAuthType.AccessToken, 
       SignatureMethod = OAuthSignatureMethod.HmacSha1, 
       ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader, 
       ConsumerKey = ConsumerKey, 
       ConsumerSecret = ConsumerKeySecret, 
       Token = AccessToken, 
       TokenSecret = AccessTokenSecret 
      }; 
     } 
    } 

    #region Helper 

    private RestResponse GetResponse(string path) 
    { 
     var client = new RestClient() 
     { 
      Authority = URL_BASE, 
      Credentials = AccessCredentials, 
      Method = WebMethod.Get 
     }; 

     var request = new RestRequest { Path = path }; 

     return client.Request(request); 
    } 

    private T Deserialize(string xmlContent) 
    { 
     MemoryStream memoryStream = new MemoryStream(Encoding.ASCII.GetBytes(xmlContent)); 
     XmlSerializer deserializer = new XmlSerializer(typeof(T)); 
     return (T)deserializer.Deserialize(new StringReader(xmlContent)); 
    } 

    #endregion 

    // methods removed for brevity. check the original link for full source 

} 
+0

Có cách nào để lưu trữ dữ liệu tùy chỉnh được trả lại sau cuộc gọi không? Ví dụ: tôi muốn lưu trữ URL của trang gốc, để chuyển hướng người dùng đến sau khi quá trình đăng nhập hoàn tất. – CMircea

+0

@MirceaChirea Bạn có dòng này CallbackUrl = "http: // localhost/home/callback", tôi nghĩ bạn chỉ cần thay đổi dòng đó và nối thêm một số tham số – Onkelborg

+0

@Onkelborg, * facepalm *, tôi chưa bao giờ nghĩ đến điều đó, haha! – CMircea

0

Nếu bạn không muốn mã đó cho mình, bạn luôn có thể nhìn vào một giải pháp của bên thứ ba như giải pháp RPX Janrain của : http://developers.janrain.com/. Nó sẽ cung cấp cho bạn đăng nhập LinkedIn và nhiều hơn nữa.

+0

Tôi quyết định không thêm một điểm không thành công vào quy trình đăng nhập trang web của tôi, cũng như các khoản phí định kỳ. – CMircea

Các vấn đề liên quan