ฉันจะตรวจสอบโทเค็นการเข้าถึง API การตรวจสอบความถูกต้องของ Google ได้อย่างไร


134

ฉันจะตรวจสอบโทเค็นการเข้าถึงการตรวจสอบสิทธิ์ของ Google ได้อย่างไร

ฉันต้องการสอบถาม Google และถาม: [โทเค็นการเข้าถึงที่ได้รับ] ถูกต้องสำหรับบัญชี Google [example@example.com] หรือไม่

เวอร์ชันสั้น :
มีความชัดเจนว่าโทเค็นการเข้าถึงที่ให้มาผ่านGoogle Authentication Api :: OAuth Authentication สำหรับแอปพลิเคชันเว็บสามารถใช้เพื่อขอข้อมูลจากบริการต่างๆของ Google ได้อย่างไร ไม่มีความชัดเจนในการตรวจสอบว่าโทเค็นการเข้าถึงที่ระบุนั้นถูกต้องสำหรับบัญชี Google ที่ระบุหรือไม่ ฉันต้องการทราบวิธีการ

เวอร์ชันยาว :
ฉันกำลังพัฒนา API ที่ใช้การตรวจสอบความถูกต้องโดยใช้โทเค็น โทเค็นจะถูกส่งคืนเมื่อมีการระบุชื่อผู้ใช้ + รหัสผ่านที่ถูกต้องหรือเมื่อมีการจัดหาโทเค็นของบุคคลที่สามจากบริการใด ๆ ที่สามารถตรวจสอบได้N

หนึ่งในบริการของบุคคลที่สามคือ Google ซึ่งอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์กับบริการของฉันโดยใช้บัญชี Google ของตน ต่อไปจะขยายไปถึงบัญชี Yahoo ผู้ให้บริการ OpenID ที่เชื่อถือได้เป็นต้น

ตัวอย่างแผนผังของการเข้าถึงโดยใช้ Google:

ข้อความแสดงแทน http://webignition.net/images/figures/auth_figure002.png

เอนทิตี 'API' อยู่ภายใต้การควบคุมของฉัน เอนทิตี 'อินเทอร์เฟซสาธารณะ' คือแอปบนเว็บหรือเดสก์ท็อป อินเทอร์เฟซสาธารณะบางส่วนอยู่ภายใต้การควบคุมของฉันส่วนอื่น ๆ จะไม่เป็นและอื่น ๆ ที่ฉันอาจไม่เคยรู้มาก่อน

ดังนั้นฉันจึงไม่สามารถเชื่อถือโทเค็นที่ให้มากับ API ในขั้นตอนที่ 3 สิ่งนี้จะถูกส่งมาพร้อมกับที่อยู่อีเมลของบัญชี Google ที่เกี่ยวข้อง

ฉันต้องการสอบถาม Google และถามว่า: โทเค็นการเข้าถึงนี้ถูกต้องสำหรับ example@example.comหรือไม่

ในกรณีนี้ example@example.com คือตัวระบุเฉพาะของบัญชี Google ซึ่งเป็นที่อยู่อีเมลที่ผู้อื่นใช้เพื่อเข้าสู่ระบบบัญชี Google ของตน ไม่สามารถสันนิษฐานได้ว่าเป็นที่อยู่ Gmail - บางคนสามารถมีบัญชี Google ได้โดยไม่ต้องมีบัญชี Gmail

เอกสารของ Google ระบุไว้อย่างชัดเจนว่าด้วยโทเค็นการเข้าถึงข้อมูลสามารถดึงข้อมูลจากบริการต่างๆของ Google ได้อย่างไร ดูเหมือนจะไม่มีอะไรระบุว่าคุณจะตรวจสอบได้อย่างไรว่าโทเค็นการเข้าถึงที่ระบุนั้นถูกต้องตั้งแต่แรกหรือไม่

อัปเดต โทเค็นใช้ได้กับ N บริการของ Google ฉันไม่สามารถลองใช้โทเค็นกับบริการของ Google ในการยืนยันได้เนื่องจากฉันไม่รู้ว่าบริการส่วนย่อยใดของ Google ทั้งหมดที่ผู้ใช้ใช้จริง

นอกจากนี้ฉันจะไม่ใช้โทเค็นการเข้าถึงการตรวจสอบความถูกต้องของ Google เพื่อเข้าถึงบริการใด ๆ ของ Google เป็นเพียงวิธีการตรวจสอบว่าผู้ใช้ Google ที่ควรจะเป็นจริงนั้นเป็นใคร หากมีวิธีอื่นในการดำเนินการนี้ฉันยินดีที่จะลอง


คำถามนี้เกี่ยวกับบริการรับรองความถูกต้องเฉพาะเจาะจงอะไรบ้าง (OAuth, AuthSub, Installed Apps, ... ) โปรดให้ลิงค์รายละเอียดเพิ่มเติม
Martin v. Löwis

@Martin v. Löwis: บริการ 'OAuth Authentication for Web Applications' - ฉันได้อัปเดตจุดเริ่มต้นของคำถามเพื่อแสดงถึงสิ่งนี้ ขอบคุณที่ชี้ให้เห็น!
Jon Cram

บทความที่น่าสนใจเกี่ยวกับการยืนยันคีย์ของ Google อาจให้ข้อมูลเชิงลึกเพิ่มเติมgroups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7
dotjoe

คำตอบ:


138

สำหรับการตรวจสอบผู้ใช้เพียงแค่โพสต์รับโทเค็นการเข้าถึงเป็น accessToken แล้วโพสต์และรับการตอบกลับ

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

คุณสามารถลองในแถบที่อยู่ในเบราว์เซอร์ได้เช่นกันใช้ HTTppost และการตอบกลับใน java ด้วย

การตอบสนองจะเป็นอย่างไร

{
     "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"
    }

ขอบเขตคือสิทธิ์ที่กำหนดของ accessToken คุณสามารถตรวจสอบรหัสขอบเขตได้ในลิงค์นี้

อัปเดต: โพสต์ API ใหม่ดังต่อไปนี้

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

การตอบสนองจะเป็น

 {
 // 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"
}

สำหรับข้อมูลเพิ่มเติมhttps://developers.google.com/identity/sign-in/android/backend-auth


11
มีเวอร์ชันใหม่กว่าสำหรับ oauth2 - v3 ของ Google ดูตัวอย่างได้ที่นี่: developers.google.com/identity/sign-in/android/backend-auth
AlikElzin-kilaka

30

คุณสามารถตรวจสอบโทเค็นการเข้าถึงการตรวจสอบสิทธิ์ของ Google โดยใช้จุดสิ้นสุดนี้:

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

นี่คือจุดสิ้นสุดของ Google V3 OAuth AccessToken ที่ตรวจสอบความถูกต้องคุณสามารถอ้างอิงจากเอกสาร Google ด้านล่าง: (ในOAUTH 2.0 ENDPOINTSแท็บ)

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


สำหรับเอกสารแบ็กเอนด์ - แหล่งที่มาของเอกสารอยู่ที่นี่
eton_ceb

26

โอเคคำตอบส่วนใหญ่ใช้ได้ แต่ไม่ถูกต้องนัก แนวคิดของ JWT คือคุณสามารถตรวจสอบโทเค็นได้โดยไม่จำเป็นต้องติดต่อผู้ออกทุกครั้ง คุณต้องตรวจสอบรหัสและยืนยันลายเซ็นของโทเค็นด้วยคีย์สาธารณะที่รู้จักของใบรับรองที่ google ใช้ในการลงนามโทเค็น

ดูโพสต์ถัดไปว่าทำไมต้องทำเช่นนี้

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


3
โปรดโหวตเพิ่มเติม! The idea of JWT is that you can validate the token without the need to contact the issuer everytime.
Moritz Schmitz v. Hülst

ใช่! ppl เป็น ddos-ing google หากพวกเขาโทรหา Google เพื่อขอข้อมูลโทเค็น
datdinhquoc

คุณไม่สามารถทำได้ด้วยโทเค็นการเข้าถึงของ Google เนื่องจากไม่ใช่ JWT ตรวจสอบstackoverflow.com/questions/48623656/…
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
คำตอบนี้เกือบจะยังใช้ได้ อย่างไรก็ตามดูเหมือนว่า Issued_to จะไม่ได้รับการตั้งค่าอีกต่อไป Developers.google.com/accounts/docs/…
Frostymarvelous

6

Google oauth code flow responseนอกจากaccess_tokenนี้ยังส่งกลับid_tokenที่มีประโยชน์สำหรับข้อมูลการตรวจสอบความถูกต้องในรูปแบบเข้ารหัส

สิ่งหนึ่งที่ทำให้ ID โทเค็นมีประโยชน์ก็คือคุณสามารถส่งต่อไปยังส่วนประกอบต่างๆของแอพของคุณได้ ส่วนประกอบเหล่านี้สามารถใช้โทเค็น ID เป็นกลไกการพิสูจน์ตัวตนที่มีน้ำหนักเบาเพื่อพิสูจน์ตัวตนแอปและผู้ใช้ แต่ก่อนที่คุณจะสามารถใช้ข้อมูลในโทเค็น ID หรือใช้ข้อมูลนี้เพื่อยืนยันว่าผู้ใช้ได้รับการพิสูจน์ตัวตนคุณต้องตรวจสอบความถูกต้อง

การตรวจสอบความถูกต้องของโทเค็น ID ต้องใช้หลายขั้นตอน:

  • ตรวจสอบว่าโทเค็น ID เป็น JWT ซึ่งลงนามอย่างถูกต้องด้วยคีย์สาธารณะของ Google ที่เหมาะสม
  • ตรวจสอบว่าค่าของการตรวจสอบในโทเค็นรหัสเท่ากับรหัสไคลเอ็นต์ของแอปของคุณ
  • ตรวจสอบว่าค่าของสถานีอวกาศนานาชาติในโทเค็นรหัสเท่ากับ accounts.google.com หรือhttps://accounts.google.com
  • ตรวจสอบว่าเวลาหมดอายุ (exp) ของโทเค็น ID ไม่ได้ผ่านไป
  • หากคุณส่งพารามิเตอร์ hd ในคำขอให้ตรวจสอบว่าโทเค็นรหัสมีการอ้างสิทธิ์ hd ที่ตรงกับโดเมนที่โฮสต์ Google Apps ของคุณ

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtokenลิงก์มีตัวอย่างโค้ดสำหรับการตรวจสอบ ID โทเค็น

ดูเพิ่มเติม/security/37818/why-use-openid-connect-instead-of-plain-oauth


1

ฉันต้องการสอบถาม Google และถามว่าโทเค็นการเข้าถึงนี้ใช้ได้กับ example@example.com หรือไม่

ไม่สิ่งที่คุณต้องมีคือขอการเข้าสู่ระบบมาตรฐานด้วยการเข้าสู่ระบบแบบรวมสำหรับผู้ใช้บัญชี Googleจากโดเมน API ของคุณ และหลังจากนั้นคุณสามารถเปรียบเทียบ "ID ผู้ใช้ถาวร" กับรหัสที่คุณมีจาก "อินเทอร์เฟซสาธารณะ"

ค่าของ realm ถูกใช้ในหน้า Google Federated Login เพื่อระบุไซต์ที่ร้องขอต่อผู้ใช้ นอกจากนี้ยังใช้เพื่อกำหนดค่าของ ID ผู้ใช้ถาวรที่ Google ส่งคืน

ดังนั้นคุณต้องมาจากโดเมนเดียวกันกับ 'อินเทอร์เฟซสาธารณะ'

และอย่าลืมว่าผู้ใช้ต้องมั่นใจว่า API ของคุณเชื่อถือได้) ดังนั้น Google จะถามผู้ใช้ว่าอนุญาตให้คุณตรวจสอบตัวตนของเขาหรือไม่


1

นี่คือตัวอย่างการใช้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();
}

0

ลองทำคำขอ OAuth-รับรองความถูกต้องใช้โทเค็นของคุณเพื่อhttps://www.google.com/accounts/AuthSubTokenInfo เอกสารนี้จัดทำขึ้นเพื่อใช้กับ AuthSub เท่านั้น แต่ใช้ได้กับ OAuth ด้วย จะไม่บอกคุณว่าโทเค็นมีไว้สำหรับผู้ใช้รายใด แต่จะบอกคุณว่าบริการใดใช้ได้และคำขอจะล้มเหลวหากโทเค็นไม่ถูกต้องหรือถูกเพิกถอน


0

ไม่สามารถใช้โทเค็นการเข้าถึง OAuth ที่กำหนดเองสำหรับการตรวจสอบสิทธิ์เนื่องจากความหมายของโทเค็นอยู่นอกข้อกำหนด OAuth Core อาจมีไว้สำหรับการใช้งานครั้งเดียวหรือช่วงเวลาหมดอายุที่แคบหรืออาจให้การเข้าถึงที่ผู้ใช้ไม่ต้องการให้ นอกจากนี้ยังทึบแสงและผู้บริโภค OAuth ที่ได้รับอาจไม่เคยเห็นตัวระบุผู้ใช้ประเภทใด ๆ

ผู้ให้บริการ OAuth และผู้บริโภคตั้งแต่หนึ่งรายขึ้นไปสามารถใช้ OAuth เพื่อจัดหาโทเค็นการตรวจสอบสิทธิ์ที่ตรวจสอบได้และมีข้อเสนอและแนวคิดในการดำเนินการดังกล่าว แต่ผู้ให้บริการตามอำเภอใจที่พูดเฉพาะ OAuth Core ไม่สามารถให้สิ่งนี้ได้หากไม่มีผู้ร่วมรายอื่น การบวชกับผู้บริโภค เมธอด AuthSubTokenInfo REST เฉพาะของ Google พร้อมกับตัวระบุของผู้ใช้นั้นใกล้เคียง แต่ก็ไม่เหมาะสมเช่นกันเนื่องจากอาจทำให้โทเค็นไม่ถูกต้องหรือโทเค็นอาจหมดอายุได้

หาก Google ID ของคุณเป็นตัวระบุ OpenId และ 'อินเทอร์เฟซสาธารณะ' ของคุณเป็นเว็บแอปหรือสามารถเรียกเบราว์เซอร์ของผู้ใช้คุณควรใช้ OpenID OP ของ Google

OpenID ประกอบด้วยเพียงแค่ส่งผู้ใช้ไปยัง OP และรับการยืนยันที่ลงชื่อกลับมา การโต้ตอบเป็นไปเพื่อผลประโยชน์ของ RP เท่านั้น ไม่มีโทเค็นที่มีอายุการใช้งานยาวนานหรือหมายเลขอ้างอิงเฉพาะผู้ใช้อื่น ๆ ที่สามารถใช้เพื่อระบุว่า RP ได้พิสูจน์ตัวตนผู้ใช้ด้วย OP สำเร็จแล้ว

วิธีหนึ่งในการตรวจสอบการพิสูจน์ตัวตนก่อนหน้านี้กับตัวระบุ OpenID คือเพียงแค่ทำการพิสูจน์ตัวตนอีกครั้งโดยสมมติว่ามีการใช้ User-agent เดียวกัน OP ควรสามารถส่งคืนการยืนยันในเชิงบวกโดยไม่ต้องมีการโต้ตอบกับผู้ใช้ (โดยการยืนยันคุกกี้หรือใบรับรองไคลเอ็นต์เป็นต้น) OP มีอิสระที่จะต้องมีการโต้ตอบกับผู้ใช้อื่นและอาจเป็นไปได้ว่าคำขอการตรวจสอบสิทธิ์นั้นมาจากโดเมนอื่น (OP ของฉันให้ฉันมีตัวเลือกในการตรวจสอบสิทธิ์ RP เฉพาะนี้อีกครั้งโดยไม่ต้องโต้ตอบในอนาคต) และในกรณีของ Google UI ที่ผู้ใช้ดำเนินการเพื่อรับโทเค็น OAuth อาจไม่ใช้ตัวระบุเซสชันเดียวกันดังนั้นผู้ใช้จะต้องตรวจสอบสิทธิ์อีกครั้ง แต่ไม่ว่าในกรณีใดคุณจะสามารถยืนยันตัวตนได้


OpenID 2.0 ถูกเลิกใช้ใหม่และปิดใช้งานโดย Google เพื่อสนับสนุน OpenID Connect ที่ใช้ OAuth ซึ่งมีโทเค็นรหัสที่ตรวจสอบได้
Vadzim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.