Luồng xác thực OAuth2
Tìm hiểu chi tiết về luồng xác thực OAuth2 và cách triển khai trong ứng dụng của bạn.
Tổng quan luồng xác thực
SePay triển khai OAuth2 theo luồng Authorization Code, một trong những luồng xác thực phổ biến và an toàn nhất của OAuth2. Luồng này phù hợp cho hầu hết các ứng dụng web và ứng dụng server-side.
Luồng xác thực OAuth2 trong SePay bao gồm các bước sau:
- Ứng dụng yêu cầu ủy quyền từ người dùng bằng cách chuyển hướng đến URL ủy quyền của SePay
- Người dùng đăng nhập vào SePay và đồng ý cấp quyền cho ứng dụng
- SePay chuyển hướng về redirect URI của ứng dụng kèm theo mã ủy quyền (authorization code)
- Ứng dụng đổi mã ủy quyền lấy access token từ SePay
- Ứng dụng sử dụng access token để gọi các API của SePay
Bước 1: Yêu cầu ủy quyền
Để bắt đầu quá trình xác thực, chuyển hướng người dùng đến URL ủy quyền của SePay:
GET https://my.sepay.vn/oauth/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_REDIRECT_URI&
scope=bank-account:read transaction:read&
state=RANDOM_STATE_VALUE
Các tham số:
Tham số | Mô tả | Yêu cầu |
---|---|---|
response_type |
Phải là code cho luồng Authorization Code |
Bắt buộc |
client_id |
Client ID của ứng dụng bạn, nhận được khi đăng ký ứng dụng | Bắt buộc |
redirect_uri |
URL nhận mã ủy quyền, phải khớp với URL đã đăng ký | Bắt buộc |
scope |
Các quyền truy cập yêu cầu, phân tách bằng dấu cách | Tùy chọn (mặc định là tất cả phạm vi đã đăng ký) |
state |
Giá trị ngẫu nhiên để ngăn tấn công CSRF, sẽ được trả về không thay đổi | Khuyến nghị |
state
nên được sử dụng để bảo vệ khỏi tấn công CSRF. Tạo một giá trị ngẫu nhiên, lưu trong session và xác minh khi nhận callback.
Bước 2: Người dùng đồng ý cấp quyền
Sau khi chuyển hướng đến URL ủy quyền, người dùng sẽ thấy màn hình đăng nhập SePay (nếu chưa đăng nhập) và sau đó là màn hình xác nhận cấp quyền:

Màn hình này hiển thị:
- Tên ứng dụng yêu cầu truy cập
- Các quyền mà ứng dụng yêu cầu
- Nút đồng ý hoặc từ chối cấp quyền
Bước 3: Nhận mã ủy quyền
Sau khi người dùng đồng ý cấp quyền, SePay sẽ chuyển hướng về redirect_uri
của bạn kèm theo mã ủy quyền:
GET https://your-app.com/callback?code=AUTHORIZATION_CODE&state=RANDOM_STATE_VALUE
Ứng dụng của bạn cần:
- Xác minh tham số
state
khớp với giá trị đã gửi trước đó - Lấy mã ủy quyền từ tham số
code
Bước 4: Đổi mã ủy quyền lấy access token
Sau khi nhận được mã ủy quyền, bạn cần đổi nó lấy access token bằng cách gửi yêu cầu POST đến endpoint token của SePay:
POST https://my.sepay.vn/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=AUTHORIZATION_CODE&
redirect_uri=YOUR_REDIRECT_URI&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET
Các tham số:
Tham số | Mô tả | Yêu cầu |
---|---|---|
grant_type |
Phải là authorization_code |
Bắt buộc |
code |
Mã ủy quyền nhận được từ bước trước | Bắt buộc |
redirect_uri |
URL chuyển hướng giống với URL đã sử dụng ở bước 1 | Bắt buộc |
client_id |
Client ID của ứng dụng bạn | Bắt buộc |
client_secret |
Client Secret của ứng dụng bạn | Bắt buộc |
Phản hồi từ server nếu thành công:
{
"access_token": "ACCESS_TOKEN",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "REFRESH_TOKEN"
}
Trường | Mô tả |
---|---|
access_token |
Token dùng để gọi API SePay |
token_type |
Loại token, luôn là "Bearer" |
expires_in |
Thời gian hiệu lực của token (tính bằng giây) |
refresh_token |
Token dùng để lấy access token mới khi hết hạn |
Bước 5: Sử dụng access token để gọi API
Sau khi nhận được access token, bạn có thể sử dụng nó để gọi các API của SePay bằng cách thêm vào header Authorization
:
GET https://my.sepay.vn/api/v1/bank-accounts
Authorization: Bearer ACCESS_TOKEN
Dưới đây là ví dụ sử dụng cURL:
curl -H "Authorization: Bearer ACCESS_TOKEN" https://my.sepay.vn/api/v1/bank-accounts
Bước 6: Làm mới access token
Access token chỉ có hiệu lực trong một khoảng thời gian giới hạn (thường là 1 giờ). Khi access token hết hạn, bạn cần sử dụng refresh token để lấy token mới mà không yêu cầu người dùng xác thực lại:
POST https://my.sepay.vn/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&
refresh_token=REFRESH_TOKEN&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET
Các tham số:
Tham số | Mô tả | Yêu cầu |
---|---|---|
grant_type |
Phải là refresh_token |
Bắt buộc |
refresh_token |
Refresh token nhận được khi lấy access token | Bắt buộc |
client_id |
Client ID của ứng dụng bạn | Bắt buộc |
client_secret |
Client Secret của ứng dụng bạn | Bắt buộc |
Phản hồi tương tự như khi đổi mã ủy quyền, bao gồm access token mới, refresh token mới và thời gian hết hạn.
Xử lý lỗi
Khi có lỗi xảy ra trong quá trình xác thực, SePay sẽ trả về mã lỗi tương ứng. Dưới đây là một số lỗi phổ biến:
Mã lỗi | Mô tả | Giải pháp |
---|---|---|
invalid_request |
Yêu cầu thiếu tham số bắt buộc hoặc chứa tham số không hợp lệ | Kiểm tra lại tất cả tham số trong yêu cầu |
invalid_client |
Xác thực client thất bại | Kiểm tra lại client_id và client_secret |
invalid_grant |
Mã ủy quyền hoặc refresh token không hợp lệ hoặc đã hết hạn | Yêu cầu người dùng xác thực lại hoặc kiểm tra refresh token |
unauthorized_client |
Client không được phép yêu cầu authorization code | Kiểm tra lại cấu hình ứng dụng |
access_denied |
Người dùng từ chối cấp quyền | Thông báo cho người dùng rằng họ cần cấp quyền để sử dụng ứng dụng |
unsupported_grant_type |
Server không hỗ trợ kiểu grant được yêu cầu | Kiểm tra tham số grant_type |
invalid_scope |
Phạm vi yêu cầu không hợp lệ, không được nhận diện hoặc vượt quá phạm vi đã đăng ký | Kiểm tra lại phạm vi yêu cầu |
Phản hồi lỗi có định dạng:
{
"error": "invalid_grant",
"error_description": "Authorization code expired"
}
Bước tiếp theo
Sau khi hiểu rõ về luồng xác thực OAuth2, bạn đã sẵn sàng để triển khai trong ứng dụng của mình. Tiếp theo, hãy tìm hiểu về cách sử dụng Access Token với các API của SePay.