Tạo API cho đăng nhập một lần với trang web của bên thứ 3


13

Trang web của tôi cần tích hợp với phần mềm của bên thứ 3, sẽ sống trên tên miền phụ của riêng nó, được lưu trữ bởi công ty phần mềm. Tôi cần cung cấp cho các nhà phát triển bên thứ 3 một điểm cuối mà họ có thể sử dụng để thực hiện các cuộc gọi API (đến trang web wordpress của tôi) để cho phép người dùng trang web của tôi truy cập vào tên miền phụ.

Trang web khác cần xác thực người dùng từ trang web của tôi thông qua một số loại API.

Tôi không chắc bắt đầu từ đâu, nhưng ý nghĩa của tôi là điều này đã được tìm ra bởi những người thông minh hơn tôi. Cảm ơn trước!


1
Loại cuộc gọi API nào sẽ cần thiết? Bạn đang cố làm gì vậy? Bạn đã xem hỗ trợ XML-RPC của WP ( codex.wordpress.org/XML-RPC_Support ) chưa?
anu

Trang web khác cần xác minh / xác thực người dùng từ trang WP của tôi.
emersonthis

Câu trả lời:


16

Các vấn đề về kịch bản chéo trang

Bạn không thể chuyển cookie WP auth giữa các tên miền. Bạn cũng không muốn lưu trữ mật khẩu văn bản gốc để đăng nhập vào một bản cài đặt WP khác theo chương trình. Vì vậy, bạn sẽ phải yêu cầu người dùng đăng nhập vào WordPress và sau đó truy cập trạng thái đăng nhập của họ thông qua điểm cuối API từ trang web của bên thứ ba. Điều này cho phép WordPress xử lý tất cả các xác thực. Nó khá an toàn vì người dùng sẽ phải đăng nhập vật lý vào phía WP để điểm cuối API cung cấp dữ liệu cho bên thứ ba.

Tạo Điểm cuối API

Kiểm tra bài viết này tôi vừa viết ở đây: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Ngoài ra, bạn có thể xem trình diễn mã ở đây: https://gist.github.com/2982319

Bạn sẽ phải tìm ra logic cho nhu cầu ứng dụng của riêng bạn, nhưng điều này sẽ cho phép bạn tạo một điểm cuối nơi bạn có thể phục vụ mọi thứ bạn muốn từ phía WordPress.

Vì bạn đang sử dụng WordPress làm trang web xác thực, bạn có thể sử dụng một kiểm tra như is_user_logged_in (). Nếu họ đã đăng nhập, hãy trả lại một đối tượng người dùng cho bên thứ ba với bất kỳ thông tin nào họ cần.

Đăng nhập từ bên thứ ba

Từ bên thứ ba, họ có thể liên kết đến trang đăng nhập của bạn để có trải nghiệm liền mạch bằng cách sử dụng var_to query var. Sau khi đăng nhập, nó sẽ chuyển chúng trở lại trang web của bên thứ ba.

http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com

Đăng nhập từ xa

Nếu bạn cần đăng nhập người dùng vào WordPress từ trang web của bên thứ ba, bạn có thể sử dụng một số chức năng WP đơn giản được liệt kê trên trang web này: http://kuttler.eu/code/log-in-a-wordpress-user-programmatically/

Bạn chắc chắn sẽ cần phải sử dụng một bí mật được chia sẻ và tạo ra các băm dựa trên thời gian để giữ bí mật. Về cơ bản, đây là những gì nó sẽ trông như thế nào:

Bên thứ ba gửi yêu cầu với dấu thời gian và mã thông báo được tạo bởi một bí mật được chia sẻ:

$shared_secret = 'foobar'; //do not send this to the API endpoint
$timestamp = time();
$token = md5($shared_secret.$time_stamp);

Cài đặt WordPress nhận được yêu cầu:

$shared_secret = 'foobar';
$timestamp = esc_attr($_GET['timestamp']);

if((time() - $timestamp) > 30) # Threshold is 30 seconds
    //do something here - TOKEN expired!

$token = md5($share_secret.$timestamp);
$token_to_check = esc_attr($_GET);

if($token == $token_to_check)
    //authenticated!

Chắc chắn rằng phần mềm của bên thứ 3 không liên quan gì đến WP, vì vậy về cơ bản, đó là dấu hiệu duy nhất, nhưng với WP đóng vai trò là nhà cung cấp xác thực.
anu

@anu: Đúng vậy.
emersonthis

@Brian: Tôi quan tâm đến ý tưởng chuyển sang cài đặt nhiều trang web, nhưng tôi không hiểu đầy đủ về điểm bạn đã thực hiện về cookie. Tất cả những gì cần xảy ra là phần mềm của bên thứ 3 cần xác minh rằng người dùng của nó thực sự là một trong những người dùng của tôi. Phần mềm này tự cung cấp và có thể cung cấp cookie riêng hoặc bất cứ thứ gì.
emersonthis

@Emerson tôi thấy bây giờ. Xin lỗi vì sự nhầm lẫn. Bạn có thể sử dụng ý tưởng điểm cuối mà tôi đã tạo và sử dụng mã thông báo được chia sẻ trong meta người dùng để xác thực. Trả lại phản hồi JSON cho bên thứ 3 nếu người dùng tồn tại.
Brian Fegter

1
Giải pháp rất hay. Có thể có một vấn đề nếu các ứng dụng được cài đặt trên các máy chủ khác nhau và từ một số lý do, thời gian của mỗi máy là khác nhau. Tôi sẽ đề nghị sử dụng counterthay vì time()và vượt qua nó với yêu cầu. Cả hai bên đều giữ bộ đếm cuối cùng được thông qua và khi api nhận được yêu cầu với bộ đếm mới, nó sẽ xác minh rằng bộ đếm mới lớn hơn bộ đếm cuối cùng. Theo cách này, một sự chậm trễ không thể làm hại bất kỳ.
Guyaloni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.