2008-12-11 43 views
73

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

Tôi cần bằng cách nào đó truy vấn Google và yêu cầu: Có [mã thông báo truy cập được cung cấp] hợp lệ cho tài khoản Google [[email protected]] không?

phiên bản ngắn:
Rõ ràng làm thế nào một thẻ truy cập được cung cấp thông qua các Google Authentication Api :: OAuth Authentication for Web Applications 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õ cách kiểm tra xem mã thông báo truy cập đã cung cấp có hợp lệ cho tài khoản Google đã cho 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ỳ dịch vụ nào trong số N có thể xác minh được.

Một trong các dịch vụ của bên thứ ba sẽ là Google, cho phép người dùng xác thực dựa vào 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, các nhà cung cấp OpenID tin cậy và vân vân.

dụ Schematic của Google truy cập dựa trên:

alt text http://webignition.net/images/figures/auth_figure002.png

Các 'API' thực thể là dưới sự kiểm soát đầy đủ của tôi. Thực thể 'giao diện công khai' 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 và những người khác mà tôi vẫn chưa bao giờ biết.

Vì vậy, 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 bằng cách nào đó truy vấn Google và yêu cầu: Mã thông báo truy cập này có hợp lệ cho [email protected] không?

Trong trường hợp này, [email protected] 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ọ. Điều này không thể được giả định là đị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 lục từ một số dịch vụ của Google. Không có gì có vẻ nhà nước như thế nào bạn có thể kiểm tra nếu một mã thông báo truy cập nhất định là hợp lệ ở nơi đầu tiên.

Cập nhật Mã thông báo hợp lệ cho dịch vụ N của Google. Tôi không thể thử một mã thông báo chống lại một dịch vụ của Google như là phương tiện xác minh nó vì tôi sẽ không biết tập hợp con nào của 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à phương tiện xác minh người dùng Google thực sự là người mà họ cho biết. Nếu có một cách khác để làm điều này tôi rất vui khi thử.

+0

Dịch vụ xác thực cụ thể nào là câu hỏi này về (OAut h, AuthSub, Ứng dụng đã cài đặt, ...)? Vui lòng cung cấp liên kết chi tiết hơn. –

+0

@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 bắt đầu của câu hỏi để phản ánh điều này. Cảm ơn bạn đã chỉ ra điều này! –

+0

bài viết thú vị về xác minh khóa google có thể cung cấp thông tin chi tiết hơn http://groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7 – dotjoe

Trả lời

-1

Cố gắng thực hiện yêu cầu hợp lệ và kiểm tra phản hồi mã thông báo không hợp lệ.

-1

Google không bao giờ có thể trả lời câu hỏi của bạn, bởi vì nó không phải "mã thông báo truy cập này có hợp lệ không?" Đó là mã thông báo + bí mật.

1

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

Không. Tất cả những gì bạn cần là yêu cầu đăng nhập chuẩn với Federated Login for Google Account Users 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 ID bạn có từ 'giao diện công khai'.

Giá trị của lĩnh vực được sử dụng trên trang Đăng nhập được 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 trả về bởi Google.

Vì vậy, bạn cần phải từ cùng một miền với 'giao diện công khai'.

Và đừng quên rằng người dùng cần phải 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 mình.

0

Thử thực hiện yêu cầu được xác thực OAuth bằng mã thông báo của bạn tới https://www.google.com/accounts/AuthSubTokenInfo. Đây chỉ là tài liệu để làm việc cho AuthSub, nhưng nó cũng hoạt động cho OAuth. Nó sẽ không cho bạn biết người dùng mã thông báo 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ố kỹ thuật của OAuth Core. Nó có thể được dùng cho một lần sử dụng đơn lẻ 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 nhận đượ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ã xác thực có thể xác minh và có đề xuất và ý tưởng để thực hiện điều này, nhưng nhà cung cấp dịch vụ tùy ý chỉ nói OAuth Core không thể cung cấp mà không có sự phối hợp khác với người tiêu dùng. Phương thức REST AuthSubTokenInfo REST của Google, cùng với số nhận dạng của người dùng, rất gần như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à mã nhận dạng OpenId và 'giao diện công khai' 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ó thể 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 dài hoặc xử lý cụ thể 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 mã đị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ả lại xác nhận tích cực mà không cần tương tác 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 là miễn phí để yêu cầu tương tác người dùng khác và có thể nếu yêu cầu xác thực đến từ một 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 đã thực hiện để nhận mã thông báo OAuth có thể không sử dụng cùng số nhận dạng 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.

+0

OpenID 2.0 đã bị Google ngưng sử dụng và bị vô hiệu hóa nhờ có kết nối OpenID dựa trên OAuth cung cấp [mã thông báo id có thể xác minh] (http://stackoverflow.com/a/31597027/603516). – Vadzim

14
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; 
    } 
} 
+0

Vâng Đó là câu trả lời mong đợi. –

+2

Câu trả lời này hầu như vẫn hợp lệ. Issued_to dường như không được đặt nữa. https://developers.google.com/accounts/docs/OAuth2UserAgent#validatetoken – frostymarvelous

80

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

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

bạn có thể thử trong thanh địa chỉ trong trình duyệt cũng vậy, sử dụng httppost và phản ứng trong java cũng

phản ứng 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 this link

+4

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

0

Dưới đây là một ví dụ sử dụng Guzzle:

/** 
* @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(); 
} 
2

Google oauth code flow response ngoài access_token cũng trả id_token chứa hữu ích để biết xác nhận dưới dạng mã hoá.

Một điều làm cho mã thông báo ID hữu ích là bạn có thể vượt qua 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 nó.

Xác nhận của một thẻ ID đòi hỏi một số bước:

  • Xác minh rằng các thẻ ID là JWT mà được ký chính xác với một khóa công khai thích hợp của Google.
  • Xác minh rằng giá trị của kiểm tra trong mã thông báo ID bằng với ID ứng dụng của ứng dụng của bạn.
  • Xác minh rằng giá trị của số trong mã thông báo ID bằng accounts.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 không được chuyển.
  • Nếu bạn đã chuyển thông 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 quyền sở hữu hd khớp với miền được lưu trữ trên Google Apps của bạn.

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

Xem thêm https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth.

3

Ok, hầu hết các câu trả lời đều 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 công khai đã biết của chứng chỉ mà Google đã sử dụng để ký mã thông báo.

Xem bài đăng tiếp theo tại sao và cách thực hiện việc này.

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

9

bạn có thể xác minh một access token xác thực của Google bằng cách sử dụng thiết bị đầu cuối này:

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

này được Google V3 OAuth AccessToken xác nhận thiết bị đầu cuối, bạn có thể tham khảo từ google tài liệu dưới đây: (Trong OAUTH 2.0 ENDPOINTS Tab)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token

Các vấn đề liên quan