Monday, April 13, 2015

OpenID Connect (Oauth 2.0 for Login)

Google OAuth 2.0 API được sử dụng cho cả Authentication và Authorization. Đây là tài liệu mô tả của chúng tôi về OAuth 2.0 và được áp dụng cho Authentication, nó phù hợp với đặc điểm kỹ thuật của OpenID Connect. Tài liệu nằm trong Using OAuth 2.0 to Access Google APIs và được áp dụng cho các dịch vụ. Nếu bạn muốn tìm hiểu phương thức này,, chúng tôi khuyên bạn quan tâm đến Google OAuth 2.0 Playgroud. Bạn có thể tìm thêm sự giúp đỡ trên Stack Overflow, từ khóa để tìm các câu hỏi liên quan đến vấn đề này là 'google-oauth'.

Chú ý: Nếu bạn sử dụng button "Sign-in with Google" do chúng tôi cung cấp để sử dụng cho website của bạn hoặc ứng dụng, chúng tôi khuyên bạn hãy dùng Google Sign-In, thư viện sign-in của khách hàng được chúng tôi xây dựng trên OAuth 2.0 và giao thức kết nối OpenID. Bạn có  thể sử dụng Google Sign-in để có được OpenID Connect định dạng thẻ truy cập, và OAuth 2.0 để truy cập thẻ cho những tương tác với Google API. Để cấu hình Google Sign-in và trả về hồ sơ thông tin từ định dạng của OpenID Connect. Sử dụng khu scope openid, và lấy về thông tin người dùng bằng việc gọi từ  people.getOpenIdConnect từ thiết bị cuối.

Setting up OAuth 2.0

Trước khi bạn có thể sử dụng Google OAuth 2.0 cho việc xác thực thông tin người dùng đăng nhập cho hệ thống của bạn, bạn phải thiết lập một dự án trong Google Developers Console để có được thông tin về OAuth 2.0, cài đặt chuyển hướng URI, và tùy chọn trong việc xây  dựng thông tin hiển thị cho người dùng khi họ truy cập vào ứng dụng của bạn. Bạn cũng có thể sử dụng Developers Console để tạo dịch vụ cho tài khoản, bật thanh toán, thiết lập các bộ lọc và làm những công việc khác. Để có thể hiểu chi tiết hơn, bạn có thể truy cập vào Google Developers Console Help.

Obtain OAuth 2.0 credentials

Còn tiếp...

Nguồn: OpenID Connect (OAuth 2.0 for Login)

Saturday, April 11, 2015

Oauth 2.0 Tutorial [Step 1]

Oauth 2.0 là một giao thức ủy quyền có thể cho phép các ứng dụng có thể truy cập vào nhiều loại dữ liệu. Trường hợp, ứng dụng game có thể truy cập vào thông tin dữ liệu của User facebook, hoặc một ứng dụng khác truy cập vào một ứng dụng khác để truy cập vào thông tin người dùng nếu được cho phép.
Và đây là mô hình minh họa cho khái niệm trên:
Hình 1: Ví dụ của Oauth 2.0 sử dụng dữ liệu chia sẻ từ phía ứng dụng

Người dùng muốn truy cập vào một ứng dụng web game. Ứng dụng game hỏi người dùng đăng nhập vào game bằng tài khoản facebook. Người dùng sử dụng facebook và đăng nhập sau đó gửi trở lại cho ứng dụng game. Tiếp theo ứng dụng game truy cập vào dữ liệu facebook của người dùng và lấy gọi các API từ facebook theo định danh của người dùng (Ví dụ: Cập nhật status,..)

Sử dụng Oauth 2.0 khi nào?
Oauth  có thể được dùng hoặc sử dụng khi tạo ra một ứng dụng để đọc thông tin dữ liệu từ một ứng dụng khác (Ví dụ như biểu đồ về cách truy cập tài nguyên của facebook ở phía trên.), hoặc ứng dụng cho phép ứng dụng khác truy cập vào dữ liệu người dùng.

Oauth 2.0 là sự thay thế cho Oauth 1.0, và nó được xem là phức tạp hơn. Oauth 1.0 liên quan đến các chứng chỉ,..vv,. Oauth 2.0 thì đơn giản hơn, nó đòi hỏi phải có chứng thực ở tất cả như SSL / TLS.

Thông tin về Oauth 2.0
Mục đích của loạt hướng dẫn này là cung cấp cho bạn có cái nhìn tổng quan về Oauth 2.0, đây  là một giao thức đơn giản để có thể hiểu được. Nó không có mục đích mô tả chi tiết về đặc điểm kỹ thuật, tuy nhiên.
Nếu bạn có kế hoạch sử dụng Oauth 2.0 thì cần học những kỹ thuật chi tiết để sử dụng nó một cách chi tiết. Bạn có thể tìm kiếm các đặc điểm kỹ thuật của Oauth 2.0 tại đây.

Nguồn: jenkov.com

Friday, April 10, 2015

Mở rộng hay đi vòng

Đây là suy nghĩ của tôi trong thời gian gần đây khi tôi phải đối mặt với quá nhiều vấn đề mà tôi nghĩ mình cần phải biết. Tôi học nhiều ngôn ngữ lập trình, nhiều đến mức mà tôi không thể hệ thống lại được để từ đó tìm ra cho mình 1 con đường mình cảm thấy hứng thú thật sự và nó thật sự cần đối với sự nghiệp của tôi sau này. Ngày đầu tiên tôi tiếp xúc với những dòng code là việc nhìn vào 1 phần mềm tính tiền điện ở trên trụ sở của xã, tôi không biết nó được viết thế nào và tôi không thể sửa nó. Mãi đến sau này tôi mới biết được rằng nó được viết bằng VB6, đầu tiên tôi được học về HTML/CSS sau đó là Visual Basic, C# và đến hệ quản trị CSDL SQL Server. Tôi tiếp xúc với những thứ này khá nhanh vì trước đó, thời THPT tôi đã có tiếp xúc với những dòng code và đưa lên hosting để cho nó chạy :) Tôi biết đến nhiều người giỏi hơn nhờ việc tiếp cận các diễn đàn, với tính khí của tuổi trẻ thì có ai mà không thích trở thành 1 siêu anh hùng phải không? Tôi xem những bộ phim hacked và tôi muốn mình được như họ, cao  siêu như thế để có thể điều khiển thế giới :D
Lang thang vào các diễn đàn hacked, cracker, UG,.. tôi quen nhiều người nhưng cũng không có nhiều người quen tôi vì chẳng biết tôi là ai, tôi không muốn khuôn mặt mình được hiện diện trên bất cứ nơi đâu ngoài những website tôi lập nên để tự sướng. Thử hỏi xem, có hacked, cracker nào mà không biết code, không biết đến Assembly, Perl, Ruby hay thậm chí là Python. Tôi học 1 trong những ngôn ngữ này, tôi luôn muốn viết những đoạn script nhỏ để giúp mình làm 1 công việc gì đó và cái tôi chọn là Python. Ở trường, tôi được học các ngôn ngữ lập trình bậc cao hơn như C# chẳng hạn, tôi không hề được học C hay C++ nhé :(( Đến khi ra trường tôi phải viết web bằng Asp.net, phải tiếp xúc với môi trường web nhiều hơn, họ bắt tôi học thêm Php, mysql. Tôi đi thêm 1 đoạn rồi nhận ra mình chắc chắn phải biết thêm Javascript, sau đó tôi tìm hiểu thêm các nền tảng mới như Nodejs, Laravel.
Nodejs thì tôi phải sử dụng javascript để làm, còn Laravel thì một framework từ Php và được viết như mô hình MVC. Tôi lại tiếp tục cảm thấy hứng thú với việc học lập trình vi điều khiển, làm các mô hình RC, và rồi đến với lĩnh vực Computer vision. Lần này tôi phải học những gì?
Học C++, tìm hiểu về nguyên lý hoạt động của máy bay, động cơ điện, cách thức xử lý ảnh kỹ thuật và thư viện OpenCV để đáp ứng sự tò mò của tôi.
Cái tôi muốn đề cập ở đây là tôi không tập trung vào bất kỳ thứ gì cả, tôi bị stress khi áp lực học tập quá lớn, kèm theo đó là áp lực từ việc học trên trường, đi làm và việc học các ngôn ngữ giao tiếp. Có người nói rằng phải có 2 đến 3 năm để có được cái nhìn overview về các lĩnh vực trong công nghệ thông tin thì sau đó mới tiếp tục đi sâu được. Thật sư là lúc tôi nghe được câu đó tôi cảm thấy vui nhưng thời gian đó đã kết thúc đối với tôi, tuy nhiên tôi vẫn rất bế tắc.
Có lẽ, giờ đây tôi đang đi vòng.


Wednesday, April 8, 2015

Huấn luyện và điều khiển hành vi người khác

Đây là 2 trong số những kỹ thuật tôi học được từ những bộ phim tôi từng xem trong thời gian gần đây.
Trước tiên tôi sẽ đề cập đến kỹ thuật "Huấn luyện người khác."

Nếu đã từng xem bộ phim "The big bang theory" chắc bạn cũng đã biết đến điều này khi Sheldon đã áp dụng phương pháp này để huấn luyện Penny (một cô hàng xóm cùng khu trung cư của anh ấy). Việc bạn cùng phòng của Sheldon có quan hệ đặc biệt với Penny nên cô và Sheldon thường xuyên gặp nhau, Penny luôn thể hiện sự khó chịu với những hành vi khác thường của Sheldon. Sheldon cũng biết điều đó. Mỗi khi thấy  Penny làm sai hoặc không hài  lòng trước hành vi nào của Penny thì anh ta luôn đưa ra ý kiến cho Penny và khuyên Penny phải thay đổi, kèm theo việc thưởng cho cô nàng 1 viên Socola. Mọi chuyện cứ tiếp tục như vậy cho đến khi Penny hình thành 1 thói quen được Sheldon huấn luyện đó là: Nghe theo lời của Sheldon và mình sẽ được 1 viên Socola, hậu quả sẽ thật bất ngờ nếu việc huấn luyện Penny được áp dụng trong 1 khoảng thời gian dài.



Kỹ thuật tiếp theo tôi sẽ nhắc đến đó là điều khiển hành vi của người khác bằng việc sắp đặt trước hay còn gọi là lập trình tiềm thức. Trong bộ phim "Focus", anh là một tên trộm hay còn gọi là 1 tên lừa đảo chuyên nghiệp. Anh lập nên kế hoạch để lừa đảo "Liyuan" (một tên cá cược chuyên nghiệp), trước tiên anh tìm mọi phương pháp để tiếp cận 'Liyuan' và cho anh ta thấy 1 con số. Đi đâu 'Liyuan' cũng thấy con số đó, sau đó là tiếp cận trực tiếp 'Liyuan' và tiến hành cá cược. Những lần cá cược đầu tiên anh ta luôn thua, tuy đây không phải cố tình vì tỉ lệ anh ta có thể thắng khi đặt cược như vậy là rất thấp. Khi tưởng trừng như không còn gì để mất, anh ta cá cược 1 lần cuối cùng, bằng việc cho 'Liyuan' lựa chọn 1 con số trên áo của các cầu thủ bóng bầu dục đang thi đấu trên sân. Và anh ta sẽ đoán con số đó, lúc này 'Liyuan' nhìn thấy 1 cầu thủ mang số áo "55", con số mà cả ngày hôm nay anh ta đi đâu cũng thấy, trong suy nghĩ của 'Liyuan' hình thành ý thức và cảm tính về việc lựa chọn con số này. Và kết quả thế nào thì chắc các bạn cũng biết.

Đừng nên suy nghĩ quá lâu, suy nghĩ càng lâu thì càng sai :)) Đừng để người khác huấn luyện bạn 1 cách dễ dàng, làm sao mà khi họ huấn luyện mình nhưng thực ra thì mình mới chính là người đang huấn luyện họ để cho mình Socola vậy, đó mới là nghệ thuật.

Trong lĩnh vực nào cũng cần áp dụng những kỹ thuật, kỹ thuật ở đây không chỉ đề cập đến công nghệ, đến yếu tố chuyên môn hay bất kỳ những gì cao siêu. Yếu tố con người luôn nắm một vai trò then chốt trong mọi tình huống. Hãy nghĩ về Kenvin Mitnick, là 1 trong top 10 Hacked được đánh giá cao về khả năng kiểm soát hệ thống, ông không phải là một người quá giỏi kỹ thuật để có thể đứng vị trí đó. Cái mà ông khai thác ở đây chính là yếu tố con người hay còn được gọi là Social Engineer.

Oauth với Gmail

Oauth là gì?
Oauth là phương pháp chia sẻ tài nguyên giữa các ứng dụng mà không phải đưa ra "giấy thông thành" là username và password.

Phân biệt Authorization và Authentication

  • Authentication: Thường liên quan đến việc bạn đã đăng nhập hệ thống hay chưa?
  • Authorization: Bạn có quyền truy cập tài nguyên của hệ thống hay không?
Thông thường 2 hình thức này luôn được đi liền với nhau khi người dùng phải đăng nhập vào hệ thống rồi mới có thể sử dụng được tài nguyên, tuy nhiên vẫn có những ứng dụng không cần sử dụng tới Authentication mà vẫn cho pháp Anonymous truy cập tới tài nguyên của hệ thống.

Để minh họa quá trình Authentication tôi có flow như sau:

  1. Client: Ứng dụng (có thể là ứng dụng desktop hay ứng dụng website,..) muốn truy cập vào tài nguyên của server.
  2. Server: Ứng dụng khác (Google, twitter, yahoo hay facebook,..)
  3. User: Chính bạn, bạn muốn truy cập vào Client và thông tin của bạn sẽ được xác minh qua Server, sau đó server sẽ trả lời lại cho bạn thông tin của bạn có đúng không? Nếu đúng thì Client sẽ cho phép bạn vào hệ thống, còn không thì thôi.
Các bước thực hiện để bạn có thể lấy được token sau mỗi lần gửi request lên server và server sẽ trả lời lại thông tin đó. Tiếp theo Client sẽ xác minh thông tin này.

Thực hiện:

Step 1: Tạo API console key

- Đăng nhập với tài khoản gmail và truy cập vào địa chỉ:
https://code.google.com/apis/console/
và thiết lập 1 project API, sau quá trình này bạn có được ClientID.

Step 2: Lây token

Vào link sau:
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/userinfo.profile&redirect_uri=your_redirect_link&response_type=token&client_id=api_console_key
 Trong đó:

  • https://accounts.google.com/o/oauth2/auth? : Link để lấy token
  • scope: Phạm vi truy cập tài khoản của người dùng khi họ sử dụng ứng dụng (có thể sử dụng nhiều scope bằng việc thêm ký tự '&').
  • redirect_uri: Link dùng để chuyển hướng sau khi đăng nhập thành công.
  • response_type: Cái bạn muốn lấy từ response, đầy là token dùng để truy cập vào dữ liệu người dùng thông qua Google API.
Step 3: Xác minh Access token.

Sau bước 2 bạn sẽ lấy được token của người dùng.

Sử dụng:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=Access-Token
và lấy kết quả. Nếu không có lỗi xảy ra thì bạn có thể sử dụng token này để lấy dữ liệu của user, một token được tạo ra sẽ có thời gian hết hiệu lực nhất định trong quá trình nó được tạo ra.

Dữ liệu mà phía server trả về là một chuỗi json và bạn phải xử lý nó để có được cái mình muốn.

Nó có dạng như sau:


{
 "issued_to": "740440442118-a9q8m5tphus2106cul2pe1vrraj1ii1m.apps.googleusercontent.com",
 "audience": "740440442118-a9q8m5tphus2106cul2pe1vrraj1ii1m.apps.googleusercontent.com",
 "user_id": "104637691590647117854",
 "scope": "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/plus.me",
 "expires_in": 3553,
 "email": "hainho@gmail.com",
 "verified_email": true,
 "access_type": "online"
}


Step 4: Sử dụng access token để sử dụng API của google.


Còn lại gì sau dự án đầu tiên

Việc trải nghiệm những công việc thực tế giúp tôi nhận ra nhiều điều hơn, cảm thấy bản thân còn nhiều thiếu sót mà phải khắc phục sớm nếu như không muốn lãnh đủ hậu quả sau này. Tôi chưa ra trường nhưng đã đang làm dự án tại một công ty, từng bước từng bước rồi tôi cũng phải bắt tay vào làm những dự án thực tế trong công ty. Nó hoàn toàn khác với những bài tập tôi làm tại trường trước đây, tôi được giao nhiệm vụ và phải hoàn thành nhiệm vụ đó một cách suất sắc.
Tôi được giao nhiều nhiệm vụ khó khăn, nhưng tôi luôn cảm thấy mình có đủ khả năng để hoàn thành nhiệm vụ đó. Khó khăn gặp phải nhiều nhưng có ai mà chưa từng gặp khó khăn trong công việc?
Cuối dự án, tôi cũng được đánh giá tương đối tốt về công việc trong thời gian làm dự án của công ty, những nhiệm vụ đó tôi đều hoàn thành khá tốt. Sau đó tôi viết email xin nghỉ 1 thời gian vì muốn tập trung vào việc chuẩn bị thi tốt nghiệp, trong thời gian này tôi cũng cố gắng tìm cho mình một việc làm parttime. Tôi suy nghĩ nhiều về dự án đầu tiên tôi làm, tôi cảm thấy mình đã mắc nhiều lỗi trong quá trình làm dự án.
Tôi không có quy trình làm việc cụ thể, không thể đưa ra những giải pháp tối ưu để giải quyết vấn đề, không có kinh nghiệm làm việc tuy nhiên tôi có nỗ lực và mục đích của tôi là phải hoàn thành công việc đó đúng thời hạn được giao. Mọi nỗ lực của tôi để hướng tới mục đích đó và nó khiến tôi nghĩ về những giải pháp tạm thời để đảm bảo tiến độ dự án, đó là suy nghĩ tệ hại nhất của tôi và tôi cảm thấy mình là người không hoàn thành tốt nhiệm vụ được giao. Thời gian nghĩ làm tôi đã cố gắng tìm ra những giải pháp mà trước đây tôi có được trong quá trình được giao công việc. Và tôi đã giải quyết xong, nhưng điều đó vẫn không thay đổi được cảm nhận thất bại trong suy nghĩ của tôi, tôi luôn cảm thấy lo lắng về những gì mình mắc lỗi. Tôi phải học lại từ đầu, tôi bắt đầu tìm kiếm về quy trình phát triển và triển khai phần mềm. Rồi tôi biết đến Agile, Scrum, Kaban,.. thật vui khi trong công ty của tôi luôn có những cao thủ về lĩnh vực này, điều đó làm tôi cảm thấy tự tin hơn rất nhiều. Tôi sẽ áp dụng nó trong những dự án tiếp theo mà công ty giao.

Monday, March 30, 2015

Python 1: Lập trình với python

Từ lâu tôi đã thích viết những đoạn mã kịch bản để xử lý những vấn đề mà tôi phải làm bằng tay , tôi ghét việc phải ngồi viết ra 1 chương trình có giao diện. Thời gian này tôi đang xin nghỉ 2 tháng tại công ty tôi đang làm việc với lý do là bân ôn thi tốt nghiệp và cần nghỉ ngơi 1 thời gian sau khi giai đoạn 1 của dự án tôi tham gia kết thúc nên tôi cũng có chút thời gian để học thêm 1 ngôn ngữ lập trình mới.

Chương trình đầu tiên tôi viết ra như sau:
In ra 1 câu thông báo và yêu cầu người dùng nhập tên và tiếp tục in ra câu thông báo với tên họ nhập vào :))

Python có thể ứng dụng trong việc lập trình web, hoặc các đoạn script chạy trên Ubuntu nên phải cho môi trường biết là tao đang làm việc với python và tao chuẩn bị cho tụi bay biết là tao chuẩn bị viết code python này !!
#!/usr/bin/env python
Còn tôi lập trình trên windows nên có dòng đó hay không cũng không quan trọng.

Tôi viết như sau:

Sau đó tôi lưu lại với file có định dạng *.py và thực hiện chạy trên command của windows. Với điều kiện là tôi đã cài đặt python trước đó (tôi sử dụng python 2.7.3), và đã khai báo môi trường trong windows.

Bài đầu tiên có vẻ đơn giản quá nên tôi không dừng lại ở đó, tôi tìm hiểu tổng quan về việc sử dụng biến, hàm và một số cú pháp cơ bản của python.

print 2+2 => và kết quả là: 4 , nhưng tôi thay đổi lại thành Print 2+2 thì hiển thị thông báo lỗi nên tôi biết được rằng: Python có phân biệt chữ hoa và chữ thường.
Tiếp theo, tôi thử gán phép tính cho 1 biến và thực hiện in biến đó ra màn hình bằng cách sau:
x = 2+2 | print x => kết quả là 4.
print x*2 => kết quả là 8
x = "What does that mean?"
print x => kết quả là : What does that mean?
Python rất linh động trong việc gán giá trị, người dùng không phải định nghĩa biến là kiểu dữ liệu gì mà nó sẽ tự nhận trong quá trình thông dịch.

Vậy làm sao tôi có thể biết được biến x là kiểu dữ liệu gì? Tôi làm như sau:

Kết quả:
What does that mean?
<type 'str'>
 Đối với việc xử lý chuỗi trong python cũng rất đơn giản. Tôi hoàn toàn có thể viết như sau:

x *10: Chuỗi "What does that mean?" sẽ được nhân lên 10 lần
Làm sao để ép kiểu trong python , tôi làm như sau:

Ở đây biến cvtInt đang có kiểu dữ liệu là 'string' nhưng sau đó được ép kiểu sang kiểu 'int' và có thể thực hiện phép tính * 5 sau đó cho ra kết quả 50.

Tôi muốn viết tiếp về việc sử dụng vòng lặp for nhưng tôi đang có chút thắc mắc về một số cú pháp trong python, việc sử dụng xrange(): và range():,.. chúng khác nhau như thế nào. Nên trong bài viết này tôi chưa dám chắc có thể khái quát được nội dung đó. Tôi sẽ tiếp tục đề cập vào những bài viết tiếp theo khi đã rõ vấn đề.

Mẹo nhỏ: Mặc định lệnh print sau khi in xong sẽ xuống dòng, nhưng nếu ta sử dụng
print 'hai',
print 'nho'
thì kết quả sẽ là : hainho (Thêm dấu phẩy ',')