Như những người khác đã đề cập, bạn có thể gửi một GET để https://www.googleapis.com/oauth2/v3/userinfo, sử dụng người mang OAuth2 mã thông báo bạn vừa nhận được, và bạn sẽ nhận được một phản ứng với một số thông tin về người dùng (id, tên, v.v.)
Điều đáng nói là Google triển khai OpenID Connect và điểm cuối của thông tin người dùng này chỉ là một phần của nó.
OpenID Connect là lớp xác thực ở trên cùng của OAuth2. Khi trao đổi ủy quyền code
tại điểm cuối mã thông báo của Google, bạn sẽ nhận được mã thông báo truy cập (tham số access_token
) cũng như mã thông báo ID OpenID Connect (tham số id_token
).
Cả hai mã thông báo này là JWT (Mã thông báo web JSON, http://tools.ietf.org/html/draft-ietf-oauth-json-web-token).
Nếu bạn giải mã chúng, bạn sẽ nhận được một số xác nhận, bao gồm id của người dùng. Nếu bạn liên kết ID này với người dùng trong DB của mình, bạn có thể ngay lập tức nhận dạng chúng mà không phải thực hiện thêm userinfo GET (tiết kiệm thời gian).
Như đã đề cập trong các nhận xét, các mã thông báo này được ký bằng khóa riêng của Google và bạn có thể muốn xác minh chữ ký bằng khóa công khai của Google (https://www.googleapis.com/oauth2/v3/certs) để đảm bảo chúng là xác thực.
Bạn có thể xem những gì trong JWT bằng cách dán nó tại https://jwt.io/ (cuộn xuống cho trình gỡ lỗi JWT). Các khẳng định giống như thế:
{
"iss":"accounts.google.com",
"id":"1625346125341653",
"cid":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
"aud":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
"token_hash":"WQfLjdG1mDJHgJutmkjhKDCdA",
"iat":1567923785,
"exp":1350926995
}
Ngoài ra còn có thư viện cho các ngôn ngữ lập trình khác nhau để programatically giải mã JWTs.
PS: để nhận danh sách URL và tính năng cập nhật được nhà cung cấp OpenID Connect của Google hỗ trợ, bạn có thể kiểm tra URL đó: https://accounts.google.com/.well-known/openid-configuration.
Lưu ý rằng gần đây Google đã thay đổi phản hồi và 'id_token' hiện chứa mã định danh tĩnh trong khóa' sub' thay vì trong khóa 'id' như trước và trong ví dụ trên. AFAIK, thay đổi này là cách giải thích của họ về giao thức OpenID Connect. Thật không may, khi tôi viết câu trả lời này có vẻ hơi ngẫu nhiên: đôi khi nó là 'id' và đôi khi nó là' phụ' nên tôi cần hỗ trợ cả hai. –