Hướng dẫn curl authorization header php - curl tiêu đề ủy quyền php
Đây là một hàm cURL có thể gửi hoặc lấy dữ liệu. Nó nên hoạt động với mọi ứng dụng PHP hỗ trợ OAuth: Show
Sử dụng nó trong các yêu cầu một chiều hoặc hai chiều: Lượt truy cập:1,131 1,131 Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu và lập trình cơ chế xác thực Basic Authentication dựa trên kiến trúc RESTful Web Services, trong đó, yêu cầu xác thực (Request) sẽ được gửi thông qua API-URI. Công cụ
Video hướng dẫn Sample Project [YouTube]
TL;DREclipse IDE for Enterprise Java Developers Basic HTTP authentication schemeĐể hiện thực được bài hướng dẫn này, chúng ta cần chuẩn bị (tối thiểu) những công cụ sau:
Trong phạm vi của bài viết, chúng ta sẽ xem cơ chế xác thực này (sau đây gọi tắt là Basic Auth) là một trong những giải pháp dùng để xác thực một người dùng (User/Client) khi gửi truy cập đến API, chúng ta sẽ không thảo luận nhiều về ưu-khuyết điểm của nó. Trong thực tế, bên cạnh cơ chế này, chúng ta còn có những cơ chế khác như (có thể dùng kết hợp với Basic Auth): API Key, Bearer Token, Digest Auth, OAuth 1.0, OAuth 2.0, Hawk Authentication, AWS Signature, NTLM Authentication, Akamai EdgeGrid.Basic Auth) là một trong những giải pháp dùng để xác thực một người
dùng (User/Client) khi gửi truy cập đến API, Xét về độ bảo mật, cơ chế Basic Auth dùng mã Base64 để mã hóa và giải mã thông tin xác thực, do vậy, thường không được đánh giá cao về độ bảo mật. Trong thực tế, nếu dùng Basic Auth, chúng ta thường kết hợp với giao thức SSL (HTTPS) để có thêm một lớp mã hóa thông tin. Xét về mặt kỹ thuật của Basic Auth, để gửi thông tin xác thực, phía máy khách cần phải “đính kèm” thông tin cần xác thực vào trường header của HTTP. Cấu trúc của Authorization header như sau:
Ví dụ, nếu username là
Có một lưu ý với Base64 trong một số ngôn ngữ lập trình, thông thường sẽ bổ sung thêm (padding) ký tự 0 (dấu bằng) sau chuỗi mã hóa. Tùy thuộc vào ngôn ngữ lập trình, chúng ta cần lưu ý điểm này khi mã hóa một chuỗi. Chẳng hạn, trong Java, thư viện 1 thông thường sẽ padding thêm ký tự 0 vào cuối chuỗi mã hóa, ngược lại, chúng ta có thể sử dụng phương thức withoutPadding().ký tự 0 vào cuối chuỗi mã hóa, ngược lại, chúng ta có thể sử dụng phương thức withoutPadding().Java Service sử dụng GET với Basic AuthTrong đoạn chương trình bên dưới, chúng ta sẽ tiến hành hiện thực lớp Authentication, trong đó, bao gồm phương thức 3 với tham số là chuỗi mã hóa Authorization header theo chuẩn Base64, kết quả trả về là 4 nếu thông tin xác thực đúng, và ngược lại.package com.soa.auth; import java.util.Base64; import javax.ws.rs.*; import javax.ws.rs.core.*; @Path("/auth") public class Authentication { @GET @Path("/v1") @Produces(MediaType.APPLICATION_JSON) public boolean auth(@HeaderParam("authorization") String authString) { // extract data before decoding String[] authParts = authString.split("\\s+"); String authInfo = authParts[1]; // decode the data back to original string byte[] bytes = null; bytes = Base64.getDecoder().decode(authInfo); String decodedAuth = new String(bytes); // extract username/password if(decodedAuth.contains(":")) { String username = decodedAuth.split(":")[0]; String password = decodedAuth.split(":")[1]; // change this line to your logic if(username.equals("admin") && password.equals("123456")) return true; } return false; } } Nếu chúng ta hiện thực các Services trong nhiều Package khác nhau, thì thẻ 5 trong tập tin 6 cần phải ghi nhận tất cả những Package đó, mỗi tên Package cần phải đầy đủ và cách nhau bằng dấu 7 (semi-colon).các Services trong nhiều Package khác nhau, thì thẻ 5 trong tập tin 6 cần phải ghi nhận tất cả những Package đó, mỗi tên Package cần phải đầy đủ và cách nhau bằng dấu 7 (semi-colon).Ví dụ Project có 2 Package ( 8 và 9), thì tập tin 6 cần phải thể hiện rõ thông tin cả 2 Package này:
Kiểm thử API bằng PostmanTrước khi kiểm thử API, chúng ta cần phải khởi động Servlet và triển khai (Deploy) dịch vụ lên Server ( package com.soa.auth; import java.util.Base64; import javax.ws.rs.*; import javax.ws.rs.core.*; @Path("/auth") public class Authentication { @GET @Path("/v1") @Produces(MediaType.APPLICATION_JSON) public boolean auth(@HeaderParam("authorization") String authString) { // extract data before decoding String[] authParts = authString.split("\\s+"); String authInfo = authParts[1]; // decode the data back to original string byte[] bytes = null; bytes = Base64.getDecoder().decode(authInfo); String decodedAuth = new String(bytes); // extract username/password if(decodedAuth.contains(":")) { String username = decodedAuth.split(":")[0]; String password = decodedAuth.split(":")[1]; // change this line to your logic if(username.equals("admin") && password.equals("123456")) return true; } return false; } }1). [Xem video hướng dẫn] lên Server ( package com.soa.auth; import java.util.Base64; import javax.ws.rs.*; import javax.ws.rs.core.*; @Path("/auth") public class Authentication { @GET @Path("/v1") @Produces(MediaType.APPLICATION_JSON) public boolean auth(@HeaderParam("authorization") String authString) { // extract data before decoding String[] authParts = authString.split("\\s+"); String authInfo = authParts[1]; // decode the data back to original string byte[] bytes = null; bytes = Base64.getDecoder().decode(authInfo); String decodedAuth = new String(bytes); // extract username/password if(decodedAuth.contains(":")) { String username = decodedAuth.split(":")[0]; String password = decodedAuth.split(":")[1]; // change this line to your logic if(username.equals("admin") && password.equals("123456")) return true; } return false; } }1). [Xem video hướng dẫn] Các bước thực hiện như sau:
Đến đây, chúng ta đã lập trình và kiểm thử API đã chạy đúng với logic đặt ra. Tại bước này, chúng ta sẽ lập trình một giao diện Web (HTML & PHP) để thể hiện giao diện đăng nhập (HTML) và gửi (PHP) gói tin chứa Authentication header đến máy chủ chứa API ( package com.soa.auth; import java.util.Base64; import javax.ws.rs.*; import javax.ws.rs.core.*; @Path("/auth") public class Authentication { @GET @Path("/v1") @Produces(MediaType.APPLICATION_JSON) public boolean auth(@HeaderParam("authorization") String authString) { // extract data before decoding String[] authParts = authString.split("\\s+"); String authInfo = authParts[1]; // decode the data back to original string byte[] bytes = null; bytes = Base64.getDecoder().decode(authInfo); String decodedAuth = new String(bytes); // extract username/password if(decodedAuth.contains(":")) { String username = decodedAuth.split(":")[0]; String password = decodedAuth.split(":")[1]; // change this line to your logic if(username.equals("admin") && password.equals("123456")) return true; } return false; } }2) và nhận (PHP) kết quả xác nhận thông tin người dùng. Chúng ta sẽ cần hiện thực tập tin package com.soa.auth; import java.util.Base64; import javax.ws.rs.*; import javax.ws.rs.core.*; @Path("/auth") public class Authentication { @GET @Path("/v1") @Produces(MediaType.APPLICATION_JSON) public boolean auth(@HeaderParam("authorization") String authString) { // extract data before decoding String[] authParts = authString.split("\\s+"); String authInfo = authParts[1]; // decode the data back to original string byte[] bytes = null; bytes = Base64.getDecoder().decode(authInfo); String decodedAuth = new String(bytes); // extract username/password if(decodedAuth.contains(":")) { String username = decodedAuth.split(":")[0]; String password = decodedAuth.split(":")[1]; // change this line to your logic if(username.equals("admin") && password.equals("123456")) return true; } return false; } }3 chứa phần mã HTML thể hiện giao diện đăng nhập, và mã PHP để gửi thông tin xác nhận đến API và nhận kết quả xác thực từ API. API.
Để thực thi được đoạn chương trình trên, chúng ta cần phải có một Web Engine trên máy tính. Bài viết này sử dụng XAMPP 5.6.40 trên hệ điều hành MacOS 10.15.3. Hình bên dưới là kết quả khi thực thi tập tin package com.soa.auth; import java.util.Base64; import javax.ws.rs.*; import javax.ws.rs.core.*; @Path("/auth") public class Authentication { @GET @Path("/v1") @Produces(MediaType.APPLICATION_JSON) public boolean auth(@HeaderParam("authorization") String authString) { // extract data before decoding String[] authParts = authString.split("\\s+"); String authInfo = authParts[1]; // decode the data back to original string byte[] bytes = null; bytes = Base64.getDecoder().decode(authInfo); String decodedAuth = new String(bytes); // extract username/password if(decodedAuth.contains(":")) { String username = decodedAuth.split(":")[0]; String password = decodedAuth.split(":")[1]; // change this line to your logic if(username.equals("admin") && password.equals("123456")) return true; } return false; } }3 trên trình duyệt Web. Tổng kếtTrong bài hướng dẫn này, chúng ta đã hoàn thành được những việc sau:
Tài nguyên tải về
|