Làm cách nào tôi có thể xác minh mã thông báo truy cập API xác thực của Google?


134

Làm cách nào tôi có thể xác minh mã thông báo truy cập xác thực của Google?

Tôi cần truy vấn Google bằng cách nào đó và hỏi: [mã thông báo truy cập] có hợp lệ cho tài khoản Google [example@example.com] không?

Phiên bản ngắn :
Rõ ràng cách mã thông báo truy cập được cung cấp thông qua Xác thực Google Api :: Xác thực OAuth cho Ứng dụng web có thể được sử dụng để sau đó yêu cầu dữ liệu từ một loạt các dịch vụ của Google. Không rõ làm thế nào để kiểm tra xem một mã thông báo truy cập nhất định có hợp lệ cho một tài khoản Google nhất định hay không. Tôi muốn biết làm thế nào.

Phiên bản dài :
Tôi đang phát triển API sử dụng xác thực dựa trên mã thông báo. Mã thông báo sẽ được trả lại khi cung cấp tên người dùng + mật khẩu hợp lệ hoặc khi cung cấp mã thông báo của bên thứ ba từ bất kỳ một trong số N dịch vụ có thể xác minh được.

Một trong những dịch vụ của bên thứ ba sẽ là Google, cho phép người dùng xác thực với dịch vụ của tôi bằng tài khoản Google của họ. Điều này sau đó sẽ được mở rộng để bao gồm các tài khoản Yahoo, nhà cung cấp OpenID đáng tin cậy, v.v.

Ví dụ sơ đồ về truy cập dựa trên Google:

văn bản thay thế http://webignition.net/images/fftime/auth_figure002.png

Thực thể 'API' nằm dưới sự kiểm soát hoàn toàn của tôi. Thực thể 'giao diện công cộng' là bất kỳ ứng dụng dựa trên web hoặc máy tính để bàn nào. Một số giao diện công cộng nằm dưới sự kiểm soát của tôi, những giao diện khác sẽ không còn những giao diện khác mà tôi thậm chí có thể không bao giờ biết đến.

Do đó, tôi không thể tin tưởng mã thông báo được cung cấp cho API ở bước 3. Điều này sẽ được cung cấp cùng với địa chỉ email tài khoản Google tương ứng.

Tôi cần truy vấn Google bằng cách nào đó và hỏi: Mã thông báo truy cập này có hợp lệ cho example@example.com không?

Trong trường hợp này, example@example.com là số nhận dạng duy nhất của tài khoản Google - địa chỉ email mà ai đó sử dụng để đăng nhập vào tài khoản Google của họ. Đây không thể được coi là một địa chỉ Gmail - ai đó có thể có tài khoản Google mà không cần có tài khoản Gmail.

Tài liệu Google nêu rõ cách thức, với mã thông báo truy cập, dữ liệu có thể được truy xuất từ ​​một số dịch vụ của Google. Dường như không có gì để nói làm thế nào bạn có thể kiểm tra xem một mã thông báo truy cập nhất định có hợp lệ ở vị trí đầu tiên hay không.

Cập nhật Mã thông báo hợp lệ cho N dịch vụ của Google. Tôi không thể thử mã thông báo đối với dịch vụ của Google như là phương tiện để xác minh vì tôi sẽ không biết tập hợp con nào trong tất cả các dịch vụ của Google mà một người dùng cụ thể thực sự sử dụng.

Hơn nữa, tôi sẽ không bao giờ sử dụng mã thông báo truy cập xác thực của Google để truy cập bất kỳ dịch vụ nào của Google, chỉ đơn thuần là một phương tiện để xác minh người dùng Google được cho là thực sự họ là ai. Nếu có một cách khác để làm điều này, tôi rất vui lòng thử.


Câu hỏi về dịch vụ xác thực cụ thể này là gì (OAuth, AuthSub, Ứng dụng đã cài đặt, ...)? Vui lòng cung cấp một liên kết chi tiết hơn.
Martin v. Löwis

@Martin v. Löwis: Dịch vụ 'Xác thực OAuth cho các ứng dụng web' - Tôi đã cập nhật phần đầu của câu hỏi để phản ánh điều này. Cảm ơn đã chỉ ra điều này!
Jon Cram

Điều thú vị về google chính xác minh có thể cung cấp cái nhìn sâu sắc hơn groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7
dotjoe

Câu trả lời:


138

Để kiểm tra người dùng, chỉ cần đăng tải nhận mã thông báo truy cập dưới dạng accessToken và đăng nó và nhận phản hồi

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken

bạn cũng có thể thử trên thanh địa chỉ trong các trình duyệt, sử dụng omepost và phản hồi trong java cũng được

phản hồi sẽ như thế nào

{
     "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
     "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
     "expires_in": 3340,
     "access_type": "offline"
    }

Phạm vi là sự cho phép của accessToken. bạn có thể kiểm tra id phạm vi trong liên kết này

Cập nhật: Bài đăng API mới như dưới đây

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

Phản hồi sẽ như

 {
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

Để biết thêm thông tin, https://developers.google.com/identity/sign-in/android/backend-auth


11
Có phiên bản mới hơn cho oauth2 - v3 của google. Xem ví dụ tại đây: developers.google.com/identity/sign-in/android/backend-auth
AlikElzin-kilaka

30

bạn có thể xác minh mã thông báo truy cập xác thực của Google bằng cách sử dụng điểm cuối này:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>

Đây là điểm cuối xác thực Google V3 OAuth AccessToken, bạn có thể tham khảo từ tài liệu google bên dưới: (Trong OAUTH 2.0 ENDPOINTSTab)

https://developers.google.com/identity/prot Protocol / OuthuthUserAgent#validate-access-token


Đối với tài liệu cuối cùng - nguồn tài liệu ở đây
eton_ceb

26

Ok, hầu hết các câu trả lời là hợp lệ nhưng không hoàn toàn đúng. Ý tưởng của JWT là bạn có thể xác thực mã thông báo mà không cần phải liên hệ với nhà phát hành mọi lúc. Bạn phải kiểm tra id và xác minh chữ ký của mã thông báo bằng khóa chung đã biết của chứng chỉ mà google đã sử dụng để ký mã thông báo.

Xem bài tiếp theo tại sao và làm thế nào để làm điều này.

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/


3
Xin vui lòng thêm nhiều upvote! The idea of JWT is that you can validate the token without the need to contact the issuer everytime.
Moritz Schmitz v. Hülst

Đúng! ppl là ddos-ing google nếu họ chỉ gọi google để biết thông tin mã thông báo
datdinhquoc

Bạn không thể làm điều này với mã thông báo truy cập Google vì chúng không phải là JWT. Kiểm tra stackoverflow.com/questions/48623656/ khăn
DanielJaramillo

18
function authenticate_google_OAuthtoken($user_id)
{
    $access_token   = google_get_user_token($user_id); // get existing token from DB
    $redirecturl    = $Google_Permissions->redirecturl;
    $client_id      = $Google_Permissions->client_id;
    $client_secret  = $Google_Permissions->client_secret;
    $redirect_uri   = $Google_Permissions->redirect_uri;
    $max_results    = $Google_Permissions->max_results;

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token;
    $response_contacts  =  curl_get_responce_contents($url);
    $response   =   (json_decode($response_contacts));

    if(isset($response->issued_to))
    {
        return true;
    }
    else if(isset($response->error))
    {
        return false;
    }
}

2
Câu trả lời này gần như vẫn còn hiệu lực. Tuy nhiên, Issued_to dường như không được đặt nữa. developers.google.com/accounts/docs/ từ
frostymarvelous

6

Phản hồi dòng mã oauth của Google ngoài ra access_tokencòn trả về id_tokencó chứa thông tin xác thực hữu ích ở dạng được mã hóa.

Một điều làm cho mã thông báo ID trở nên hữu ích là thực tế là bạn có thể chuyển chúng xung quanh các thành phần khác nhau của ứng dụng. Các thành phần này có thể sử dụng mã thông báo ID làm cơ chế xác thực nhẹ xác thực ứng dụng và người dùng. Nhưng trước khi bạn có thể sử dụng thông tin trong mã thông báo ID hoặc dựa vào thông tin đó để xác nhận rằng người dùng đã xác thực, bạn phải xác thực thông tin đó.

Xác thực mã thông báo ID yêu cầu một số bước:

  • Xác minh rằng mã thông báo ID là JWT được ký hợp lệ với khóa công khai Google thích hợp.
  • Xác minh rằng giá trị của aud trong mã thông báo ID bằng với ID khách hàng của ứng dụng của bạn.
  • Xác minh rằng giá trị của hiện tại trong mã thông báo ID bằng với tài khoản.google.com hoặc https://accounts.google.com .
  • Xác minh rằng thời gian hết hạn (exp) của mã thông báo ID chưa được thông qua.
  • Nếu bạn đã chuyển một tham số hd trong yêu cầu, hãy xác minh rằng mã thông báo ID có xác nhận hd phù hợp với miền được lưu trữ trên Google Apps của bạn.

https://developers.google.com/identity/prot Protocol / OpenIDConnect # validatinganidtoken liên kết có các mẫu mã để xác thực mã thông báo ID.

Xem thêm /security/37818/why-use-openid-connect-instead-of-plain-oauth .


1

Tôi cần truy vấn Google bằng cách nào đó và hỏi: Mã thông báo truy cập này có hợp lệ cho example@example.com không?

Không. Tất cả những gì bạn cần là yêu cầu đăng nhập tiêu chuẩn với Đăng nhập được liên kết cho Người dùng tài khoản Google từ miền API của bạn. Và chỉ sau đó, bạn mới có thể so sánh "ID người dùng liên tục" với một ID bạn có từ 'giao diện công cộng'.

Giá trị của vương quốc được sử dụng trên trang Đăng nhập Liên kết của Google để xác định trang web yêu cầu cho người dùng. Nó cũng được sử dụng để xác định giá trị của ID người dùng liên tục được Google trả về.

Vì vậy, bạn cần có cùng tên miền với 'giao diện công cộng'.

Và đừng quên rằng người dùng cần chắc chắn rằng API của bạn có thể được tin cậy;) Vì vậy, Google sẽ hỏi người dùng nếu nó cho phép bạn kiểm tra danh tính của anh ta.


1

Đây là một ví dụ sử dụng Guheads :

/**
 * @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token
 * @return array|false False if token is invalid or array in the form
 * 
 * array (
 *   'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'scope' => 'https://www.googleapis.com/auth/calendar',
 *   'expires_in' => 3350,
 *   'access_type' => 'offline',
 * )
 */
public static function tokenInfo($accessToken) {
    if(!strlen($accessToken)) {
        return false;
    }

    if($accessToken[0] === '{') {
        $accessToken = json_decode($accessToken)->access_token;
    }

    $guzzle = new \GuzzleHttp\Client();

    try {
        $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
            'query' => ['access_token' => $accessToken],
        ]);
    } catch(ClientException $ex) {
        return false;
    }

    return $resp->json();
}

0

Hãy thử thực hiện một yêu cầu được xác thực OAuth bằng cách sử dụng mã thông báo của bạn tới https://www.google.com/accounts/AuthSubTokenInfo . Điều này chỉ được ghi nhận để hoạt động cho AuthSub, nhưng nó cũng hoạt động cho OAuth. Nó sẽ không cho bạn biết mã thông báo dành cho người dùng nào, nhưng nó sẽ cho bạn biết dịch vụ nào hợp lệ và yêu cầu sẽ thất bại nếu mã thông báo không hợp lệ hoặc đã bị thu hồi.


0

Không thể sử dụng mã thông báo truy cập OAuth tùy ý để xác thực, vì ý nghĩa của mã thông báo nằm ngoài thông số OAuth Core. Nó có thể được dành cho một lần sử dụng hoặc cửa sổ hết hạn hẹp, hoặc nó có thể cung cấp quyền truy cập mà người dùng không muốn cung cấp. Nó cũng mờ đục và người tiêu dùng OAuth có được nó có thể chưa bao giờ thấy bất kỳ loại định danh người dùng nào.

Nhà cung cấp dịch vụ OAuth và một hoặc nhiều người tiêu dùng có thể dễ dàng sử dụng OAuth để cung cấp mã thông báo xác thực có thể xác minh và có các đề xuất và ý tưởng để thực hiện việc này ngoài đó, nhưng nhà cung cấp dịch vụ tùy ý chỉ nói OAuth Core không thể cung cấp điều này mà không cần đồng phạm khác. xuất gia với người tiêu dùng. Phương thức AuthSubTokenInfo REST dành riêng cho Google, cùng với mã định danh người dùng, gần, nhưng cũng không phù hợp, vì nó có thể làm mất hiệu lực mã thông báo hoặc mã thông báo có thể hết hạn.

Nếu ID Google của bạn là số nhận dạng OpenId và 'giao diện công cộng' của bạn là ứng dụng web hoặc có thể gọi trình duyệt của người dùng, thì có lẽ bạn nên sử dụng OpenID OP của Google.

OpenID bao gồm chỉ gửi người dùng đến OP và nhận lại xác nhận đã ký. Sự tương tác chỉ dành cho lợi ích của RP. Không có mã thông báo tồn tại lâu hoặc xử lý dành riêng cho người dùng khác có thể được sử dụng để chỉ ra rằng RP đã xác thực thành công người dùng bằng OP.

Một cách để xác minh xác thực trước đó đối với định danh OpenID là chỉ thực hiện lại xác thực, giả sử cùng một tác nhân người dùng đang được sử dụng. OP sẽ có thể trả về một xác nhận tích cực mà không cần tương tác của người dùng (ví dụ bằng cách xác minh cookie hoặc chứng chỉ ứng dụng khách). OP có thể yêu cầu tương tác người dùng khác và có thể sẽ có nếu yêu cầu xác thực đến từ một tên miền khác (OP của tôi cho tôi tùy chọn để xác thực lại RP cụ thể này mà không tương tác trong tương lai). Và trong trường hợp của Google, giao diện người dùng mà người dùng đã trải qua để nhận mã thông báo OAuth có thể không sử dụng cùng một mã định danh phiên, do đó người dùng sẽ phải xác thực lại. Nhưng trong mọi trường hợp, bạn sẽ có thể khẳng định danh tính.


OpenID 2.0 đã bị Google phản đối và vô hiệu hóa vì có lợi cho OpenID Connect dựa trên OAuth cung cấp mã thông báo id có thể xác minh .
Vadzim
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.