AuthSub ในไลบรารีของไคลเอ็นต์โปรโตคอลข้อมูลของ Google

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

เอกสารนี้อธิบายวิธีใช้ไลบรารีของไคลเอ็นต์ Google Data API เพื่อเชื่อมต่อกับการตรวจสอบสิทธิ์ AuthSub สำหรับเว็บแอปพลิเคชันของ Google

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

ไลบรารีของไคลเอ็นต์ Google Data API มีเมธอดที่จะช่วยให้คุณใช้ AuthSub ในเว็บแอปพลิเคชันได้ โดยเฉพาะอย่างยิ่ง มีวิธีการสร้าง URL ของคำขอ การขอโทเค็นการตรวจสอบสิทธิ์แบบใช้ครั้งเดียว การแลกเปลี่ยนโทเค็นแบบใช้ครั้งเดียวเป็นโทเค็นเซสชัน และการลงนามในคำขอ

หมายเหตุ: ไลบรารีของไคลเอ็นต์ JavaScript มี AuthSub ในรูปแบบของตัวเองที่เรียกว่า AuthSubJS ดูข้อมูลเกี่ยวกับวิธีใช้ AuthSubJS ในแอปพลิเคชัน JavaScript ได้ที่การใช้การตรวจสอบสิทธิ์ "AuthSub" กับไลบรารีของไคลเอ็นต์ JavaScript

กลุ่มเป้าหมาย

เอกสารนี้มีไว้สำหรับโปรแกรมเมอร์ที่ต้องการให้แอปพลิเคชันบนเว็บเข้าถึงบริการของ Google ในนามของผู้ใช้ โดยใช้ไลบรารีของไคลเอ็นต์ Google Data APIs

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

การใช้ AuthSub และ Google Data API โดยไม่มีไลบรารีของไคลเอ็นต์

หากต้องการให้ไคลเอ็นต์เว็บแอปพลิเคชันโต้ตอบกับบริการข้อมูลของ Google โดยใช้ AuthSub เป็นระบบการตรวจสอบสิทธิ์ ทุกสิ่งที่คุณจำเป็นต้องรู้จะอยู่ในการตรวจสอบสิทธิ์ AuthSub สำหรับเว็บแอปพลิเคชัน คุณไม่จำเป็นต้องใช้ไลบรารีของไคลเอ็นต์ Google Data API หากไม่ต้องการ

ต่อไปนี้คือโครงร่างของวิธีที่แอปพลิเคชันอาจตรวจสอบสิทธิ์ผู้ใช้โดยใช้ AuthSub

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

ไลบรารีของไคลเอ็นต์ Google Data APIs ช่วยลดความซับซ้อนของกระบวนการให้สิทธิ์นี้ด้วยการจัดการรายละเอียดต่างๆ ให้คุณ เอกสารนี้จะอธิบายวิธีการ

การทำงานกับ AuthSub และ Google Data API: ตัวอย่างไลบรารีของไคลเอ็นต์

ส่วนนี้แสดงตัวอย่างการใช้วิธีการในไลบรารีของไคลเอ็นต์ Google Data APIs เพื่อทำตามขั้นตอนที่ระบุไว้ในส่วน "การทำงานกับ AuthSub" ของเอกสารประกอบ AuthSub

ในตัวอย่างนี้ เราจะผสานรวมอินเทอร์เฟซ AuthSub เข้ากับเว็บแอปพลิเคชันที่โต้ตอบกับ Google ปฏิทิน (แม้ว่าคุณจะไม่จำเป็นต้องทราบข้อมูลใดๆ เกี่ยวกับ Google ปฏิทินเพื่อทำตามตัวอย่างนี้) ตัวอย่างนี้ถือว่าเว็บแอปพลิเคชันโฮสต์อยู่ที่ example.com

เลือกประเภทโทเค็นที่จะใช้ (session=0 หรือ session=1)

คุณเลือกใช้โทเค็นแบบใช้ครั้งเดียว (session=0) หรือโทเค็นเซสชัน (session=1) ได้ เอกสารนี้จะใช้โทเค็นเซสชันเนื่องจากมีประโยชน์มากกว่าในแอปพลิเคชันที่จะส่งคำขอ API หลายรายการ ดังที่ได้กล่าวไว้ในเอกสารประกอบ AuthSub หากคุณตัดสินใจที่จะใช้โทเค็นเซสชันในเว็บแอปพลิเคชัน คุณจะต้องจัดการที่เก็บโทเค็นด้วยตนเอง เอกสารนี้ไม่ครอบคลุมการจัดการโทเค็น นอกจากนี้ โปรดทราบว่าโทเค็นที่ขอด้วย session=0 จะแลกเปลี่ยน (อัปเกรด) เป็นโทเค็นเซสชันที่มีอายุยาวนานในภายหลังไม่ได้

เลือกว่าจะลงทะเบียนเว็บแอปพลิเคชัน (secure=0 หรือ secure=1) หรือไม่

AuthSub สามารถใช้ได้ใน 3 โหมด ได้แก่ ไม่ได้ลงทะเบียน ลงทะเบียนแล้ว และลงทะเบียนพร้อมการรักษาความปลอดภัยที่ดียิ่งขึ้น ส่วนที่เหลือของเอกสารนี้จะอ้างอิงถึงตัวเลือกสุดท้ายเป็น AuthSub ที่ปลอดภัย แม้ว่าโหมดที่ไม่ได้ลงทะเบียน/ลงทะเบียนจะตั้งค่าได้ง่ายกว่า AuthSub ที่ปลอดภัย แต่ Google ขอแนะนำให้คุณใช้โทเค็นที่ปลอดภัย เพื่อความปลอดภัยที่ดียิ่งขึ้น

วิธีลงทะเบียน

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

  1. การรักษาความปลอดภัยในระดับที่สูงขึ้น
  2. ได้รับความไว้วางใจจาก Google (ไม่มีคำเตือนแสดงต่อผู้ใช้ในหน้าการให้สิทธิ์ของ Google)

AuthSub ที่ลงทะเบียนและปลอดภัย

หากเลือกใช้ AuthSub ที่ปลอดภัย คุณจะต้องสร้างคู่คีย์ส่วนตัว RSA แบบ Self-signed และใบรับรองสาธารณะนอกเหนือจากการลงทะเบียนเว็บแอปพลิเคชัน ดูตัวอย่างการสร้างใบรับรอง X.509 ได้ที่หัวข้อการสร้างคีย์และใบรับรองเพื่อใช้กับโหมดที่ลงทะเบียน (ด้านล่าง)

กำหนดขอบเขตการเข้าถึงข้อมูล

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

เนื่องจากเราตัดสินใจที่จะโต้ตอบกับ Google Calendar API scope จึงควรเป็น http://www.google.com/calendar/feeds/

หมายเหตุ: ตั้งค่าขอบเขตเป็น URL ที่กว้างที่สุดเสมอ เว้นแต่คุณต้องการการจำกัดที่ละเอียดกว่า เช่น ขอบเขตที่แคบลงอย่าง scope=http://www.google.com/calendar/feeds/default/allcalendars/full จะจำกัดสิทธิ์เข้าถึงของโทเค็น เฉพาะฟีด allcalendars/full การใช้ scope=http://www.google.com/calendar/feeds/ จะช่วยให้เข้าถึงฟีดทั้งหมดของ ปฏิทินได้ที่ http://www.google.com/calendar/feeds/*

โทเค็นแบบหลายขอบเขต

หากต้องการสร้างโทเค็นที่เข้าถึง Google Data API หลายรายการ ให้คั่นแต่ละขอบเขตด้วยช่องว่างที่เข้ารหัส URL ตัวอย่างด้านล่างสร้างโทเค็น ซึ่งจะมีสิทธิ์เข้าถึงทั้งข้อมูล Google Contacts และ Google ปฏิทินของผู้ใช้

scope=http://www.google.com/calendar/feeds/%20http://www.google.com/m8/feeds/

ขอโทเค็นการตรวจสอบสิทธิ์แบบใช้ครั้งเดียว

หากต้องการรับโทเค็น AuthSub สำหรับผู้ใช้และบริการที่ต้องการ แอปพลิเคชันของคุณต้องเปลี่ยนเส้นทางผู้ใช้ไปยัง URL ของ AuthSubRequest ซึ่งจะแจ้งให้ผู้ใช้เข้าสู่ระบบบัญชี Google (ดูข้อมูลเพิ่มเติมเกี่ยวกับ AuthSubRequest URL ได้ที่การตรวจสอบสิทธิ์ AuthSub สำหรับเว็บแอปพลิเคชันฉบับเต็ม)

หากต้องการสร้าง AuthSubRequest URL ในแอปพลิเคชัน ให้ใช้ข้อมูลต่อไปนี้สำหรับแต่ละไลบรารีไคลเอ็นต์

Java

import com.google.gdata.client.*;

String nextUrl = "http://www.example.com/RetrieveToken.jsp";
String scope = "http://www.google.com/calendar/feeds/";
boolean secure = false;  // set secure=true to request secure AuthSub tokens
boolean session = true;
String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);

หากต้องการตรวจสอบสิทธิ์ผู้ใช้ในโดเมน G Suite ให้ทำดังนี้

import com.google.gdata.client.*;

String hostedDomain = "example.com";
String nextUrl = "http://www.example.com/RetrieveToken.jsp";
String scope = "http://www.google.com/calendar/feeds/";
boolean secure = false;  // set secure=true to request AuthSub tokens
boolean session = true;
String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);

.NET

using Google.GData.Client;

String nextUrl = "http://www.example.com/RetrieveToken.aspx";
String scope = "http://www.google.com/calendar/feeds/";
bool secure = false; // set secure=true to request secure AuthSub tokens
bool session = true;
String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);

หากต้องการตรวจสอบสิทธิ์ผู้ใช้ในโดเมน G Suite ให้ทำดังนี้

using Google.GData.Client;

String hostedDomain = "example.com";
String nextUrl = "http://www.example.com/RetrieveToken.aspx";
String scope = "http://www.google.com/calendar/feeds/";
bool secure = false; // set secure=true to request secure AuthSub tokens
bool session = true;
String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);

PHP

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_AuthSub');

$nextUrl = 'http://www.example.com/RetrieveToken.php';
$scope = 'http://www.google.com/calendar/feeds/';
$secure = 0;  // set $secure=1 to request secure AuthSub tokens
$session = 1;
$authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session);

หากต้องการตรวจสอบสิทธิ์ผู้ใช้ในโดเมน G Suite ให้ทำดังนี้

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_AuthSub');

$hostedDomain = 'example.com';
$nextUrl = 'http://www.example.com/RetrieveToken.php';
$scope = 'http://www.google.com/calendar/feeds/';
$secure = 0;  // set $secure=1 to request secure AuthSub tokens
$session = 1;
$authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session) . '&hd=' . $hostedDomain;

Python

import gdata.auth

next = 'http://www.example.com/RetrieveToken.pyc'
scope = 'http://www.google.com/calendar/feeds/'
secure = False  # set secure=True to request secure AuthSub tokens
session = True
auth_sub_url = gdata.auth.GenerateAuthSubRequestUrl(next, scope, secure=secure, session=session)

หากต้องการตรวจสอบสิทธิ์ผู้ใช้ในโดเมน G Suite ให้ทำดังนี้

import gdata.auth

hosted_domain = 'example.com'
next = 'http://www.example.com/RetrieveToken.pyc'
scope = 'http://www.google.com/calendar/feeds/'
secure = False  # set secure=True to request secure AuthSub tokens
session = True
auth_sub_url = gdata.auth.GenerateAuthSubRequestUrl(next, scope, secure=secure, session=session, domain=hosted_domain)

หลังจากสร้าง URL "ถัดไป" แล้ว แอปพลิเคชันจะใช้ URL นี้ได้หลายวิธีเพื่อส่งผู้ใช้ไปยัง AuthSubRequest ตัวแฮนเดิล แนวทางที่พบบ่อยที่สุดคือการแสดงหน้าที่แจ้งให้ผู้ใช้ทราบว่าต้องคลิกลิงก์เพื่อ ให้สิทธิ์แอปพลิเคชันของคุณเข้าถึงบัญชี Google จากนั้นแนบ URL ของคำขอไปกับลิงก์ เช่น คุณอาจแสดงผลสตริงต่อไปนี้ ในเว็บแอป

String authorizationUrl =
        "<p>MyApp needs access to your Google Calendar account to read your Calendar feed. " +
        "To authorize MyApp to access your account, <a href=\"" + authSubUrl + "\">log in to your account</a>.</p>";

ผู้ใช้คลิกลิงก์ไปยังหน้า AuthSub ที่ Google แล้วเข้าสู่ระบบ จากนั้นระบบ AuthSub จะเปลี่ยนเส้นทางผู้ใช้กลับไปยังแอปพลิเคชันของคุณโดยใช้ URL "next" ที่คุณระบุ

แยกโทเค็นแบบใช้ครั้งเดียว

เมื่อ Google เปลี่ยนเส้นทางกลับไปยังแอปพลิเคชันของคุณ ระบบจะเพิ่มโทเค็นต่อท้าย URL "next" เป็นพารามิเตอร์การค้นหา ในกรณีของตัวอย่าง ข้างต้น หลังจากที่ผู้ใช้เข้าสู่ระบบแล้ว Google จะเปลี่ยนเส้นทางไปยัง URL เช่น http://www.example.com/RetrieveToken?token=DQAADKEDE แอปพลิเคชันควรดึงค่าโทเค็นจากพารามิเตอร์การค้นหา URL

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

ไลบรารีของไคลเอ็นต์มีวิธีการที่สะดวกในการแยกโทเค็นแบบใช้ครั้งเดียว ดังนี้

Java

String singleUseToken = AuthSubUtil.getTokenFromReply(httpServletRequest.getQueryString());

.NET

String singleUseToken = Request.QueryString["token"];
// or
String singleUseToken = AuthSubUtil.getTokenFromReply(new Uri(Request.QueryString));

PHP

$singleUseToken = $_GET['token'];

Python

current_url = 'http://' + req.hostname + req.unparsed_uri
# Unlike the other calls, extract_auth_sub_token_from_url() will create an AuthSubToken or SecureAuthSubToken object.
# Use str(single_use_token) to return the token's string value.
single_use_token = gdata.auth.extract_auth_sub_token_from_url(current_url)

หากใช้ AuthSub ที่ปลอดภัย โปรดตั้งค่าคีย์ส่วนตัว RSA เพื่อให้ระบบสร้าง SecureAuthSubToken

f = open('/path/to/yourRSAPrivateKey.pem')
rsa_key = f.read()
f.close()
current_url = 'http://' + req.hostname + req.unparsed_uri
# Unlike the other calls, extract_auth_sub_token_from_url() will create an AuthSubToken or SecureAuthSubToken object.
# Use str(single_use_token) to return the token's string value.
single_use_token = gdata.auth.extract_auth_sub_token_from_url(current_url, rsa_key=rsa_key)

ขอโทเค็นของเซสชัน

โทเค็นที่คุณดึงมาจาก URL จะเป็นโทเค็นแบบใช้ครั้งเดียวเสมอ ขั้นตอนถัดไปคือการอัปเกรดโทเค็นดังกล่าวเป็นโทเค็นเซสชันที่มีอายุยาวนานโดยใช้ AuthSubSessionToken URL ตามที่อธิบายไว้ ในเอกสารประกอบฉบับเต็มของการตรวจสอบสิทธิ์ AuthSub สำหรับเว็บแอปพลิเคชัน หากใช้ AuthSub ที่ปลอดภัย คุณจะต้องตั้งค่าคีย์ส่วนตัว RSA ก่อนทำการแลกเปลี่ยน ตัวอย่างการใช้ไลบรารีของไคลเอ็นต์แต่ละรายการมีดังนี้

Java

import com.google.gdata.client.*;
import com.google.gdata.client.calendar.*;

String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null);

CalendarService calendarService = new CalendarService("google-ExampleApp-v1.0");
calendarService.setAuthSubToken(sessionToken, null);

// ready to interact with Calendar feeds

สำหรับ AuthSub ที่ปลอดภัย ให้ส่งคีย์ส่วนตัว RSA ไปยัง exchangeForSessionToken แทนการส่ง null ดังนี้

import com.google.gdata.client.*;
import com.google.gdata.client.calendar.*;

java.security.PrivateKey privateKey =
    AuthSubUtil.getPrivateKeyFromKeystore("AuthSubExample.jks", "privKeyPa$$word", "AuthSubExample", "privKeyPa$$word");
String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, privateKey);

CalendarService calendarService = new CalendarService("google-ExampleApp-v1.0");
calendarService.setAuthSubToken(sessionToken, privateKey);

// ready to interact with Calendar feeds

.NET

using Google.GData.Client;
using Google.GData.Calendar;

String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null).ToString();

GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "google-ExampleApp-v1.0");
authFactory.Token = (String) sessionToken;

CalendarService calendarService = new CalendarService(authFactory.ApplicationName);
calendarService.RequestFactory = authFactory;

// ready to interact with Calendar feeds

สำหรับ AuthSub ที่ปลอดภัย ให้ส่งคีย์ส่วนตัว RSA ไปยัง exchangeForSessionToken แทนการส่ง null ดังนี้

using Google.GData.Client;
using Google.GData.Calendar;

protected AsymmetricAlgorithm getRsaKey()
{
  X509Certificate2 cert = new X509Certificate2("C:/MyAspSite/test_cert.pfx", "privKeyPa$$word");
  RSACryptoServiceProvider privateKey = cert.PrivateKey as RSACryptoServiceProvider;
  return privateKey;
}

AsymmetricAlgorithm rsaKey = getRsaKey();
String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, rsaKey).ToString();

GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "google-ExampleApp-v1.0");
authFactory.Token = (String) sessionToken;
authFactory.PrivateKey = rsaKey;

CalendarService calendarService = new CalendarService(authFactory.ApplicationName);
calendarService.RequestFactory = authFactory;

// ready to interact with Calendar feeds

PHP

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_Calendar');

$sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken);

// Create a Calendar service object and set the session token for subsequent requests
$calendarService = new Zend_Gdata_Calendar(null, 'google-ExampleApp-v1.0');
$calendarService->setAuthSubToken($sessionToken);

// ready to interact with Calendar feeds

สำหรับการตรวจสอบสิทธิ์ AuthSub ที่ปลอดภัย การแลกเปลี่ยนกำหนดให้คุณต้องตั้งค่า Zend_Gdata_HttpClient ก่อน และตั้งค่าคีย์ส่วนตัว RSA โดยใช้ setAuthSubPrivateKeyFile() ดังนี้

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_Calendar');

$client = new Zend_Gdata_HttpClient();
$client->setAuthSubPrivateKeyFile('/path/to/myrsakey.pem', null, true);
$sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken, $client);

$calendarService = new Zend_Gdata_Calendar($client, 'google-ExampleApp-v1.0');
$calendarService->setAuthSubToken($sessionToken);

// ready to interact with Calendar feeds

Python

import gdata.calendar
import gdata.calendar.service

calendar_service = gdata.calendar.service.CalendarService()
calendar_service.UpgradeToSessionToken(single_use_token)  # calls gdata.service.SetAuthSubToken() for you

# ready to interact with Calendar feeds

หมายเหตุ: กระบวนการนี้จะเหมือนกับ AuthSub ที่ปลอดภัยตราบใดที่คุณได้ใช้ gdata.auth.extract_auth_sub_token_from_url(url, rsa_key=rsa_key) เพื่อดึงโทเค็นแบบใช้ครั้งเดียว

หมายเหตุ: เมื่อใช้ AuthSub ที่ปลอดภัย ระบบจะไม่ส่งคีย์ส่วนตัวของคุณผ่านเครือข่าย ไลบรารีของไคลเอ็นต์จะส่งลายเซ็นที่ไม่ซ้ำกันซึ่งสร้างขึ้นโดยการลงนามคำขอด้วยคีย์ของคุณ ไม่ใช่คีย์เอง

ใช้โทเค็นเซสชัน

คุณสามารถใช้โทเค็นเซสชันเพื่อตรวจสอบสิทธิ์คำขอไปยังเซิร์ฟเวอร์ได้โดยวางโทเค็นไว้ในส่วนหัวการให้สิทธิ์ ตามที่อธิบายไว้ในเอกสารประกอบ AuthSub

หลังจากตั้งค่าโทเค็นเซสชันแล้ว คุณจะใช้การเรียกไลบรารีของไคลเอ็นต์ Google Data APIs มาตรฐานเพื่อโต้ตอบกับบริการได้ โดยไม่ต้องกังวลเรื่องโทเค็น ดูรายละเอียดได้ในเอกสารประกอบของไลบรารีของไคลเอ็นต์และคู่มือสำหรับนักพัฒนาซอฟต์แวร์ Google Data APIs สำหรับบริการและภาษาที่คุณใช้

การเรียกข้อมูลเกี่ยวกับโทเค็นเซสชัน

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

Java

Map<String, String> tokenInfo = AuthSubUtil.getTokenInfo(sessionToken, null);

หากคุณใช้ AuthSub ที่ปลอดภัย ให้ส่งคีย์ส่วนตัว RSA ดังนี้

Map<String, String> tokenInfo = AuthSubUtil.getTokenInfo(sessionToken, privateKey);

.NET

Dictionary<String, String> tokenInfo = AuthSubUtil.GetTokenInfo(sessionToken, null);

หากคุณใช้ AuthSub ที่ปลอดภัย ให้ส่งคีย์ส่วนตัว RSA ดังนี้

Dictionary<String, String> tokenInfo = AuthSubUtil.GetTokenInfo(sessionToken, privateKey);

PHP

$tokenInfo = Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken);

หากใช้ AuthSub ที่ปลอดภัย ให้ส่ง Zend_Gdata_HttpClient เพื่อให้คำขอได้รับการลงนามด้วยคีย์ส่วนตัว RSA ของคุณ

$tokenInfo = Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken, $client);

Python

token_info = calendar_service.AuthSubTokenInfo()

เพิกถอนโทเค็นเซสชัน

โทเค็นเซสชัน AuthSub จะไม่มีวันหมดอายุ ไคลเอ็นต์สามารถจัดเก็บโทเค็นเซสชันได้นานเท่าที่ต้องการ

ดังนั้น เมื่อไคลเอ็นต์ใช้โทเค็นเซสชันเสร็จแล้ว ก็สามารถเพิกถอนโทเค็นได้โดยใช้แฮนเดิล AuthSubRevokeToken ตามที่อธิบายไว้ในเอกสารประกอบ AuthSub

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

หากต้องการเพิกถอนโทเค็น ให้ใช้คำสั่งต่อไปนี้ในไลบรารีไคลเอ็นต์แต่ละรายการ

Java

AuthSubUtil.revokeToken(sessionToken, null);

หากคุณใช้ AuthSub ที่ปลอดภัย ให้ส่งคีย์ส่วนตัว RSA ดังนี้

AuthSubUtil.revokeToken(sessionToken, privateKey);

.NET

AuthSubUtil.revokeToken(sessionToken, null);

หากคุณใช้ AuthSub ที่ปลอดภัย ให้ส่งคีย์ส่วนตัว RSA ดังนี้

AuthSubUtil.revokeToken(sessionToken, privateKey);

PHP

$wasRevoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken);

หากใช้ AuthSub ที่ปลอดภัย ให้ส่ง Zend_Gdata_HttpClient เพื่อให้คำขอได้รับการลงนามด้วยคีย์ส่วนตัว RSA ของคุณ

$wasRevoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken, $client);

Python

calendar_service.RevokeAuthSubToken()

แหล่งข้อมูลและตัวอย่างเพิ่มเติม

กลับไปด้านบน

การสร้างคีย์ส่วนตัวแบบ Self-Signing และใบรับรองสาธารณะเพื่อใช้กับ AuthSub ที่ปลอดภัย

ระบบใช้คีย์ส่วนตัวเพื่อสร้างลายเซ็น ซึ่งต้องรวมไว้กับคำขอแต่ละรายการ Google ใช้คีย์สาธารณะที่ฝังอยู่ในใบรับรองเพื่อยืนยันลายเซ็น คีย์สาธารณะต้องเป็นคีย์ RSA ขนาด 1024 บิตที่เข้ารหัสในใบรับรอง X.509 ในรูปแบบ PEM คุณควรส่งใบรับรองให้ Google ในเวลาที่ลงทะเบียน

ส่วนต่อไปนี้จะแสดงตัวอย่างวิธีสร้างคีย์และใบรับรองโดยใช้เครื่องมือ 2 อย่าง ได้แก่ ยูทิลิตี OpenSSL และยูทิลิตี keytool ของ Java

ตัวอย่างเหล่านี้ไม่ได้เจาะจงสำหรับ Google Data API คุณสามารถใช้ยูทิลิตีเดียวกันเพื่อสร้างคีย์สำหรับวัตถุประสงค์ใดก็ได้

ตัวอย่างนี้ถือว่าบริษัทของคุณชื่อ My_Company ตั้งอยู่ที่ Mountain View รัฐแคลิฟอร์เนีย สหรัฐอเมริกา และมีชื่อโดเมนเป็น example.com

การสร้างคีย์โดยใช้ OpenSSL

หากต้องการสร้างคู่คีย์ RSA และใบรับรองที่เกี่ยวข้อง คุณสามารถใช้คำสั่งต่อไปนี้

# Generate the RSA keys and certificate
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \
  '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \
  myrsakey.pem -out /tmp/myrsacert.pem

คำเตือน: การใส่พารามิเตอร์ -nodes จะสร้างคีย์ส่วนตัวโดยไม่มีรหัสผ่านเพื่อปกป้องคีย์ อย่างไรก็ตาม คุณควรพิจารณาละเว้นพารามิเตอร์นี้เพื่อเพิ่มความปลอดภัย

-sha1 พารามิเตอร์ระบุว่าจะใช้คีย์เพื่อสร้างลายเซ็น SHA1

พารามิเตอร์ -subj ระบุตัวตนของแอปพลิเคชันที่ใบรับรองแสดง

พารามิเตอร์ -keyout จะระบุไฟล์ที่จะมีคีย์ ไฟล์นี้มีข้อมูลที่ละเอียดอ่อน จึงควรได้รับการปกป้องและไม่ควรแชร์กับใคร

พารามิเตอร์ -out จะระบุไฟล์ที่จะมีใบรับรองในรูปแบบ PEM (ซึ่งส่งให้ Google ได้ขณะลงทะเบียน)

สร้างคีย์สำหรับไคลเอ็นต์ .NET

เฟรมเวิร์ก .NET ไม่เข้าใจคีย์หรือใบรับรองที่จัดเก็บในรูปแบบ PEM ดังนั้น คุณจึงต้องทำตามขั้นตอนเพิ่มเติมเมื่อสร้างไฟล์ .pem แล้ว ดังนี้

openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"

ขั้นตอนนี้จะสร้างไฟล์ PFX จากคีย์ส่วนตัวและใบรับรอง คุณสามารถนำเข้าไฟล์นี้ไปยังไลบรารีของไคลเอ็นต์ .NET เพื่อลงนามในคำขอที่ส่งไปยัง Google Data API แบบดิจิทัล

สร้างคีย์สำหรับไคลเอ็นต์ Java

ไคลเอ็นต์ Java ยอมรับคีย์ส่วนตัวในรูปแบบ PKCS#8 หลังจากสร้างคีย์/ใบรับรองโดยใช้วิธีการด้านบนแล้ว ให้สร้างไฟล์ .pk8 จากไฟล์ .pem ที่สร้างขึ้น

openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8

หรือคุณจะใช้ที่เก็บคีย์ Java และยูทิลิตี Keytool เพื่อสร้างคู่คีย์ RSA และใบรับรองที่เกี่ยวข้อง ก็ได้ ใช้คำสั่งต่อไปนี้

# Generate the RSA keys and certificate
keytool -genkey -v -alias Example -keystore ./Example.jks\
  -keyalg RSA -sigalg SHA1withRSA\
  -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain  View, ST=CA, C=US"\
  -storepass changeme -keypass changeme

คำเตือน: "changeme" ไม่ใช่รหัสผ่านที่ดี นี่เป็นเพียงตัวอย่าง

พารามิเตอร์ -dname ระบุตัวตนของแอปพลิเคชันที่ใบรับรองแสดง พารามิเตอร์ -storepass ระบุรหัสผ่านเพื่อปกป้องคีย์สโตร์ พารามิเตอร์ -keypass จะระบุรหัสผ่านเพื่อปกป้องคีย์ส่วนตัว

หากต้องการเขียนใบรับรองลงในไฟล์ที่ใช้ในเครื่องมือ ManageDomains ได้ ให้ใช้คำสั่งต่อไปนี้

# Output the public certificate to a file
keytool -export -rfc -keystore ./Example.jks -storepass changeme \
  -alias Example -file mycert.pem

กลับไปด้านบน