ภาพรวม
วัตถุประสงค์: เอกสารนี้อธิบายวิธีใช้คลาสยูทิลิตีของ GoogleCredential เพื่อให้สิทธิ์ OAuth 2.0 กับบริการของ Google ดูข้อมูลเกี่ยวกับฟังก์ชันทั่วไปของ OAuth 2.0 ที่เรามีได้ที่ OAuth 2.0 และไลบรารีของไคลเอ็นต์ OAuth ของ Google สําหรับ Java
สรุป: หากต้องการเข้าถึงข้อมูลที่มีการป้องกันซึ่งจัดเก็บไว้ในบริการของ Google ให้ใช้ OAuth 2.0 เพื่อให้สิทธิ์ Google API รองรับขั้นตอน OAuth 2.0 สําหรับแอปพลิเคชันไคลเอ็นต์ประเภทต่างๆ ในขั้นตอนทั้งหมดนี้ แอปพลิเคชันไคลเอ็นต์จะขอโทเค็นเพื่อการเข้าถึงที่เชื่อมโยงกับแอปพลิเคชันไคลเอ็นต์และเจ้าของข้อมูลที่มีการป้องกันที่มีการเข้าถึงเท่านั้น นอกจากนี้ โทเค็นเพื่อการเข้าถึงยังเชื่อมโยงกับขอบเขตที่จํากัดซึ่งกําหนดประเภทข้อมูลที่แอปพลิเคชันไคลเอ็นต์ของคุณมีสิทธิ์เข้าถึง (เช่น "จัดการงานของคุณ") เป้าหมายสําคัญของ OAuth 2.0 คือการให้สิทธิ์เข้าถึงข้อมูลที่ปลอดภัยและสะดวกสบาย พร้อมทั้งลดผลกระทบที่อาจเกิดขึ้นหากโทเค็นเพื่อการเข้าถึงถูกขโมย
แพ็กเกจ OAuth 2.0 ในไลบรารีของไคลเอ็นต์ Google API สําหรับ Java สร้างขึ้นบนไลบรารีของไคลเอ็นต์ Google OAuth 2.0 สําหรับ Java อเนกประสงค์
โปรดดูรายละเอียดในเอกสารประกอบของ JavaScript สําหรับแพ็กเกจต่อไปนี้
- com.google.api.client.googleapis.auth.oauth2 (จาก google-api-client)
- com.google.api.client.googleapis.extensions.appengine.auth.oauth2 (จาก google-api-client-appengine)
คอนโซล Google API
ก่อนจะเข้าถึง Google API ได้ คุณต้องสร้างโปรเจ็กต์ในคอนโซล Google API เพื่อวัตถุประสงค์ด้านการตรวจสอบสิทธิ์และการเรียกเก็บเงิน ไม่ว่าไคลเอ็นต์จะเป็นแอปพลิเคชันที่ติดตั้งไว้ แอปพลิเคชันบนอุปกรณ์เคลื่อนที่ เว็บเซิร์ฟเวอร์ หรือไคลเอ็นต์ที่ทํางานในเบราว์เซอร์ก็ตาม
ดูวิธีการตั้งค่าข้อมูลเข้าสู่ระบบได้อย่างเหมาะสมที่ความช่วยเหลือของคอนโซล API
ข้อมูลเข้าสู่ระบบ
ข้อมูลเข้าสู่ระบบของ Google
GoogleCredential เป็นคลาสตัวช่วยระดับชุดข้อความสําหรับ OAuth 2.0 สําหรับการเข้าถึงทรัพยากรที่มีการป้องกันโดยใช้โทเค็นเพื่อการเข้าถึง ตัวอย่างเช่น หากคุณมีโทเค็นเพื่อการเข้าถึงแล้ว คุณสร้างคําขอได้ด้วยวิธีต่อไปนี้
GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); Plus plus = new Plus.builder(new NetHttpTransport(), GsonFactory.getDefaultInstance(), credential) .setApplicationName("Google-PlusSample/1.0") .build();
ข้อมูลระบุตัวตนของ Google App Engine
ข้อมูลเข้าสู่ระบบที่ใช้ทางเลือกนี้อิงตาม API ของ Java สําหรับ App Engine ของ Google App Engine App Identity API ให้ข้อมูลรับรองแก่แอปพลิเคชันของไคลเอ็นต์ ซึ่งต่างจากข้อมูลเข้าสู่ระบบที่แอปพลิเคชันไคลเอ็นต์ขอรับสิทธิ์เข้าถึงข้อมูลของผู้ใช้ปลายทาง
ใช้ AppIdentityCredential (จาก google-api-client-appengine) ข้อมูลรับรองนี้ง่ายขึ้นมากเนื่องจาก Google App Engine จะดูแลรายละเอียดทั้งหมด คุณระบุขอบเขต OAuth 2.0 ที่ต้องการได้
โค้ดตัวอย่างจาก urlshortener-robots-appengine-sample:
static Urlshortener newUrlshortener() { AppIdentityCredential credential = new AppIdentityCredential( Collections.singletonList(UrlshortenerScopes.URLSHORTENER)); return new Urlshortener.Builder(new UrlFetchTransport(), GsonFactory.getDefaultInstance(), credential) .build(); }
ที่เก็บข้อมูล
โดยทั่วไปโทเค็นเพื่อการเข้าถึงจะมีวันที่หมดอายุเป็น 1 ชั่วโมง หลังจากนั้นคุณจะได้รับข้อผิดพลาดหากพยายามใช้งาน
GoogleCredential มีหน้าที่ดูแล "Refresh" โทเค็นโดยอัตโนมัติ ซึ่งหมายความว่าจะได้รับโทเค็นเพื่อการเข้าถึงใหม่ ซึ่งทําได้โดยใช้โทเค็นการรีเฟรชที่ใช้ได้นาน ซึ่งมักจะได้รับมาพร้อมกับโทเค็นเพื่อการเข้าถึงหากคุณใช้พารามิเตอร์ access_type=offline
ระหว่างขั้นตอนรหัสการให้สิทธิ์ (ดู GoogleAuthorizationCodeFlow.Builder.setAccessType(String))
แอปพลิเคชันส่วนใหญ่จะต้องยืนยันโทเค็นการเข้าถึงและ/หรือโทเค็นการรีเฟรชข้อมูลรับรอง หากต้องการคงสิทธิ์เข้าถึงข้อมูลเข้าสู่ระบบและ/หรือโทเค็นการรีเฟรชเอาไว้ คุณอาจระบุ DataStoreFactory พร้อมกับ StoredCredential เอง หรือจะใช้การดําเนินการต่อไปนี้จากไลบรารีได้
- AppEngineDataStoreFactory: คงข้อมูลเข้าสู่ระบบโดยใช้ Google App Engine Data Store API
- MemoryDataStoreFactory: "persists" ข้อมูลเข้าสู่ระบบในหน่วยความจํา ซึ่งมีประโยชน์เป็นพื้นที่เก็บข้อมูลระยะสั้นตลอดอายุการใช้งานของกระบวนการนี้
- FileDataStoreFactory: คงข้อมูลเข้าสู่ระบบไว้ในไฟล์
ผู้ใช้ AppEngine: AppEngineCredentialStore เลิกใช้งานแล้วและจะถูกนําออกเร็วๆ นี้ เราขอแนะนําให้ใช้ AppEngineDataStoreFactory กับ StoredCredential หากมีข้อมูลเข้าสู่ระบบที่จัดเก็บในรูปแบบเดิม ให้ใช้วิธีการช่วยเหลือที่เพิ่มเข้ามา ได้แก่ migrateTo(AppEngineDataStoreFactory) หรือ migrateTo(DataStore) เพื่อดําเนินการย้ายข้อมูล
คุณอาจใช้ DataStoreCredentialRefreshListener และตั้งค่าเป็นข้อมูลเข้าสู่ระบบโดยใช้ GoogleCredential.Builder.addRefreshListener(CredentialRefreshListener))
โฟลว์รหัสการให้สิทธิ์
ใช้ขั้นตอนการให้สิทธิ์เพื่ออนุญาตให้ผู้ใช้ปลายทางให้สิทธิ์แอปพลิเคชันในการเข้าถึงข้อมูลที่มีการป้องกันใน Google API โปรโตคอลสําหรับขั้นตอนนี้มีการระบุอยู่ในการให้สิทธิ์รหัสการให้สิทธิ์
ขั้นตอนนี้ทําโดยใช้ GoogleAuthorizationCodeFlow ขั้นตอนมีดังต่อไปนี้
- ผู้ใช้ปลายทางจะเข้าสู่ระบบแอปพลิเคชันของคุณ คุณจะต้องเชื่อมโยงผู้ใช้รายนั้นกับรหัสผู้ใช้ที่ไม่ซ้ํากันสําหรับแอปพลิเคชันของคุณ
- โดยเรียก AuthorizationCodeFlow.loadCredential(String)) ตามรหัสผู้ใช้ เพื่อตรวจสอบว่าข้อมูลเข้าสู่ระบบของผู้ใช้ปลายทางทราบอยู่แล้วหรือไม่ หากเป็นเช่นนั้น แสดงว่าเราทําเสร็จเรียบร้อยแล้ว
- หากไม่มี โปรดเรียก AuthorizationCodeFlow.newAuthorizationUrl() และนําทางเบราว์เซอร์ของผู้ใช้ปลายทางไปยังหน้าการให้สิทธิ์เพื่อให้สิทธิ์แอปพลิเคชันในการเข้าถึงข้อมูลที่มีการป้องกัน
- จากนั้นเซิร์ฟเวอร์การให้สิทธิ์ของ Google จะเปลี่ยนเส้นทางเบราว์เซอร์กลับไปยัง URL เปลี่ยนเส้นทางที่แอปพลิเคชันระบุไว้ พร้อมพารามิเตอร์การค้นหา
code
ใช้พารามิเตอร์code
เพื่อขอโทเค็นเพื่อการเข้าถึงโดยใช้ AuthorizationCodeFlow.newTokenRequest(String)) - ใช้ AuthorizationCodeFlow.createAndStoreCredential(TokenResponse, String)) เพื่อจัดเก็บและรับข้อมูลรับรองสําหรับการเข้าถึงทรัพยากรที่มีการป้องกัน
แต่หากไม่ได้ใช้ GoogleAuthorizationCodeFlow คุณจะใช้คลาสระดับล่างกว่าได้
- ใช้ DataStore.get(String) เพื่อโหลดข้อมูลเข้าสู่ระบบจาก Store ตาม User-ID
- ใช้ GoogleAuthorizationCodeRequestUrl เพื่อนําเบราว์เซอร์ไปยังหน้าการให้สิทธิ์
- ใช้ AuthorizationCodeResponseUrl ประมวลผลการตอบกลับการให้สิทธิ์และแยกวิเคราะห์รหัสการให้สิทธิ์
- ใช้ GoogleAuthorizationCodeTokenRequest เพื่อขอโทเค็นเพื่อการเข้าถึงและอาจใช้โทเค็นการรีเฟรช
- สร้าง GoogleCredential ใหม่และจัดเก็บไว้โดยใช้ DataStore.set(String, V)
- เข้าถึงทรัพยากรที่มีการป้องกันโดยใช้
GoogleCredential
ระบบจะรีเฟรชโทเค็นเพื่อการเข้าถึงที่หมดอายุโดยอัตโนมัติโดยใช้โทเค็นการรีเฟรช (หากมี) ตรวจสอบว่าได้ใช้ DataStoreCredentialRefreshListener และตั้งค่าสําหรับข้อมูลเข้าสู่ระบบโดยใช้ GoogleCredential.Builder.addRefreshListener(CredentialRefreshListener))
เมื่อตั้งค่าโปรเจ็กต์ในคอนโซล Google API คุณต้องเลือกข้อมูลเข้าสู่ระบบที่แตกต่างกันตามกระบวนการที่คุณใช้ โปรดดูรายละเอียดเพิ่มเติมที่หัวข้อการตั้งค่า OAuth 2.0 และสถานการณ์ OAuth 2.0 ข้อมูลโค้ดสําหรับแต่ละขั้นตอนมีดังนี้
แอปพลิเคชันเว็บเซิร์ฟเวอร์
โปรดดูโปรโตคอลสําหรับขั้นตอนนี้ได้ในหัวข้อการใช้ OAuth 2.0 สําหรับแอปพลิเคชันเว็บเซิร์ฟเวอร์
ไลบรารีนี้มอบคลาสตัวช่วยของเซิร์ฟเล็ตเพื่อให้ขั้นตอนการให้สิทธิ์การให้สิทธิ์ใช้งานได้ง่ายขึ้นสําหรับกรณีการใช้งานพื้นฐาน คุณเพียงแค่ให้คลาสย่อยที่เป็นรูปธรรมของ AbstractAuthorizationCodeServlet และ AbstractAuthorizationCodeCallbackServlet (จาก google-oauth-client-servlet) และเพิ่มลงในไฟล์ web.xml ของคุณ โปรดทราบว่าคุณยังคงต้องจัดการการเข้าสู่ระบบของผู้ใช้สําหรับเว็บแอปพลิเคชันและดึงรหัสผู้ใช้ออก
public class CalendarServletSample extends AbstractAuthorizationCodeServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // do stuff } @Override protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException { GenericUrl url = new GenericUrl(req.getRequestURL().toString()); url.setRawPath("/oauth2callback"); return url.build(); } @Override protected AuthorizationCodeFlow initializeFlow() throws IOException { return new GoogleAuthorizationCodeFlow.Builder( new NetHttpTransport(), GsonFactory.getDefaultInstance(), "[[ENTER YOUR CLIENT ID]]", "[[ENTER YOUR CLIENT SECRET]]", Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory( DATA_STORE_FACTORY).setAccessType("offline").build(); } @Override protected String getUserId(HttpServletRequest req) throws ServletException, IOException { // return user ID } } public class CalendarServletCallbackSample extends AbstractAuthorizationCodeCallbackServlet { @Override protected void onSuccess(HttpServletRequest req, HttpServletResponse resp, Credential credential) throws ServletException, IOException { resp.sendRedirect("/"); } @Override protected void onError( HttpServletRequest req, HttpServletResponse resp, AuthorizationCodeResponseUrl errorResponse) throws ServletException, IOException { // handle error } @Override protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException { GenericUrl url = new GenericUrl(req.getRequestURL().toString()); url.setRawPath("/oauth2callback"); return url.build(); } @Override protected AuthorizationCodeFlow initializeFlow() throws IOException { return new GoogleAuthorizationCodeFlow.Builder( new NetHttpTransport(), GsonFactory.getDefaultInstance() "[[ENTER YOUR CLIENT ID]]", "[[ENTER YOUR CLIENT SECRET]]", Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory( DATA_STORE_FACTORY).setAccessType("offline").build(); } @Override protected String getUserId(HttpServletRequest req) throws ServletException, IOException { // return user ID } }
แอปพลิเคชัน Google App Engine
ขั้นตอนการให้สิทธิ์ใน App Engine เกือบจะเหมือนกันกับขั้นตอนการให้สิทธิ์รหัสการให้สิทธิ์ของนํามาใช้ แต่เราสามารถใช้ประโยชน์จาก User Java API ของ Google App Engine ผู้ใช้ต้องลงชื่อเข้าสู่ระบบเพื่อเปิดใช้ API ของผู้ใช้สําหรับ Java โปรดดูข้อมูลเกี่ยวกับการเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าเข้าสู่ระบบหากยังไม่ได้เข้าสู่ระบบที่ความปลอดภัยและการตรวจสอบสิทธิ์ (ใน web.xml)
ความแตกต่างหลักๆ จากกรณีของเซิร์ฟเล็ตคือคุณให้คลาสย่อยที่เป็นรูปธรรมของ AbstractAppEngineAuthorizationCodeServlet และ AbstractAppEngineAuthorizationCodeCallbackServlet (จาก google-oauth-client-appengine
โดยขยายคลาสเซิร์ฟเล็ตเชิงนามธรรมและนําเมธอด getUserId
ไปใช้สําหรับคุณโดยใช้ User Java API AppEngineDataStoreFactory
(จาก google-http-client-appengine)
เป็นตัวเลือกที่ดีในการรักษาข้อมูลรับรองโดยใช้ Google App Engine Data
Store API
ตัวอย่างที่ถ่าย (แก้ไขเล็กน้อย) จาก calendar-appengine-sample ดังนี้
public class CalendarAppEngineSample extends AbstractAppEngineAuthorizationCodeServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // do stuff } @Override protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException { return Utils.getRedirectUri(req); } @Override protected AuthorizationCodeFlow initializeFlow() throws IOException { return Utils.newFlow(); } } class Utils { static String getRedirectUri(HttpServletRequest req) { GenericUrl url = new GenericUrl(req.getRequestURL().toString()); url.setRawPath("/oauth2callback"); return url.build(); } static GoogleAuthorizationCodeFlow newFlow() throws IOException { return new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, getClientCredential(), Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory( DATA_STORE_FACTORY).setAccessType("offline").build(); } } public class OAuth2Callback extends AbstractAppEngineAuthorizationCodeCallbackServlet { private static final long serialVersionUID = 1L; @Override protected void onSuccess(HttpServletRequest req, HttpServletResponse resp, Credential credential) throws ServletException, IOException { resp.sendRedirect("/"); } @Override protected void onError( HttpServletRequest req, HttpServletResponse resp, AuthorizationCodeResponseUrl errorResponse) throws ServletException, IOException { String nickname = UserServiceFactory.getUserService().getCurrentUser().getNickname(); resp.getWriter().print("<h3>" + nickname + ", why don't you want to play with me?</h1>"); resp.setStatus(200); resp.addHeader("Content-Type", "text/html"); } @Override protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException { return Utils.getRedirectUri(req); } @Override protected AuthorizationCodeFlow initializeFlow() throws IOException { return Utils.newFlow(); } }
ดูตัวอย่างเพิ่มเติมได้ที่ storage-serviceaccount-appengine-sample
บัญชีบริการ
GoogleCredential รองรับบัญชีบริการด้วย บัญชีบริการให้สิทธิ์เข้าถึงข้อมูลแอปพลิเคชันของตัวเอง ซึ่งต่างจากข้อมูลเข้าสู่ระบบที่แอปพลิเคชันไคลเอ็นต์ส่งคําขอเพื่อเข้าถึงข้อมูลของผู้ใช้ปลายทาง แอปพลิเคชันไคลเอ็นต์จะลงนามคําขอโทเค็นเพื่อการเข้าถึงโดยใช้คีย์ส่วนตัวที่ดาวน์โหลดจากคอนโซล Google API
ตัวอย่างโค้ดที่ได้จาก plus-serviceaccount-cmdline-sample
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); JsonFactory jsonFactory = GsonFactory.getDefaultInstance(); ... // Build service account credential. GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json")) .createScoped(Collections.singleton(PlusScopes.PLUS_ME)); // Set up global Plus instance. plus = new Plus.Builder(httpTransport, jsonFactory, credential) .setApplicationName(APPLICATION_NAME).build(); ...
ดูตัวอย่างเพิ่มเติมได้ที่ storage-serviceaccount-cmdline-sample
การแอบอ้างเป็นบุคคลอื่น
นอกจากนี้ยังใช้ขั้นตอนของบัญชีบริการเพื่อแอบอ้างเป็นผู้ใช้ในโดเมนที่คุณเป็นเจ้าของได้ด้วย ซึ่งคล้ายกับการทํางานของบัญชีบริการด้านบน แต่คุณเรียก GoogleCredential.Builder.setServiceAccountUser(String) เพิ่มเติมก็ได้
แอปพลิเคชันที่ติดตั้ง
นี่คือโฟลว์รหัสการให้สิทธิ์ของบรรทัดคําสั่งที่อธิบายไว้ในหัวข้อการใช้ OAuth 2.0 สําหรับแอปพลิเคชันที่ติดตั้งไว้
ตัวอย่างข้อมูลโค้ดจาก plus-cmdline-sample
public static void main(String[] args) { try { httpTransport = GoogleNetHttpTransport.newTrustedTransport(); dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR); // authorization Credential credential = authorize(); // set up global Plus instance plus = new Plus.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName( APPLICATION_NAME).build(); // ... } private static Credential authorize() throws Exception { // load client secrets GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(PlusSample.class.getResourceAsStream("/client_secrets.json"))); // set up authorization code flow GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( httpTransport, JSON_FACTORY, clientSecrets, Collections.singleton(PlusScopes.PLUS_ME)).setDataStoreFactory( dataStoreFactory).build(); // authorize return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); }
แอปพลิเคชันฝั่งไคลเอ็นต์
หากต้องการใช้ขั้นตอนไคลเอ็นต์บนเบราว์เซอร์ตามที่อธิบายไว้ในการใช้ OAuth 2.0 สําหรับแอปพลิเคชันฝั่งไคลเอ็นต์ โดยปกติคุณจะต้องทําตามขั้นตอนต่อไปนี้
- เปลี่ยนเส้นทางผู้ใช้ปลายทางในเบราว์เซอร์ไปยังหน้าการให้สิทธิ์โดยใช้ GoogleBrowserClientRequestUrl เพื่อให้สิทธิ์แอปพลิเคชันของเบราว์เซอร์เข้าถึงข้อมูลที่มีการป้องกันของผู้ใช้ปลายทาง
- ใช้ไลบรารีของไคลเอ็นต์ Google API สําหรับ JavaScript เพื่อประมวลผลโทเค็นเพื่อการเข้าถึงในส่วน URL ของ URI การเปลี่ยนเส้นทางที่ลงทะเบียนไว้ที่คอนโซล Google API
ตัวอย่างการใช้สําหรับเว็บแอปพลิเคชัน
public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException { String url = new GoogleBrowserClientRequestUrl("812741506391.apps.googleusercontent.com", "https://oauth2.example.com/oauthcallback", Arrays.asList( "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile")).setState("/profile").build(); response.sendRedirect(url); }
Android
ไลบรารีใดที่จะใช้กับ Android ให้ทําดังนี้
หากคุณกําลังพัฒนาสําหรับ Android และ Google API ที่ต้องการใช้จะรวมอยู่ใน ไลบรารีบริการ Google Play ให้ใช้ไลบรารีนั้นเพื่อประสิทธิภาพและประสบการณ์ที่ดีที่สุด หาก Google API ที่คุณต้องการใช้กับ Android ไม่ได้อยู่ในไลบรารีบริการ Google Play คุณสามารถใช้ไลบรารีของไคลเอ็นต์ Google API สําหรับ Java ซึ่งรองรับ Android 4.0 (Ice Cream Sandwich) (หรือใหม่กว่า) ตามที่อธิบายไว้ที่นี่ การรองรับ Android ในไลบรารีของไคลเอ็นต์ Google API สําหรับ Java คือ @Beta
ข้อมูลเบื้องต้น
ตั้งแต่ Eclair (SDK 2.1) บัญชีผู้ใช้จะได้รับการจัดการในอุปกรณ์ Android โดยใช้ผู้จัดการบัญชี การให้สิทธิ์แอปพลิเคชัน Android ทั้งหมดจะได้รับการจัดการโดย SDK จากส่วนกลางโดยใช้ AccountManager คุณระบุขอบเขตของ OAuth 2.0 ที่แอปพลิเคชันต้องใช้ และจะแสดงโทเค็นเพื่อการเข้าถึงที่ใช้งานได้
ขอบเขต OAuth 2.0 ได้รับการระบุผ่านพารามิเตอร์ authTokenType
เป็น oauth2:
และขอบเขต เช่น
oauth2:https://www.googleapis.com/auth/tasks
ซึ่งระบุสิทธิ์การอ่าน/เขียนของ Google Tasks API หากคุณต้องการขอบเขต OAuth 2.0 หลายรายการ ให้ใช้รายการที่คั่นด้วยช่องว่าง
API บางรายการมีพารามิเตอร์ authTokenType
พิเศษที่ใช้ได้เช่นกัน เช่น &"Manage your tasks" คือชื่อแทนของตัวอย่าง authtokenType
ที่แสดงด้านบน
คุณต้องระบุคีย์ API จากคอนโซล Google API ด้วย หากไม่เป็นเช่นนั้น โทเค็นที่ AccountManager จะให้ เพียงโควต้าแบบไม่ระบุตัวตนซึ่งมักจะต่ํามาก ในทางตรงกันข้าม การระบุคีย์ API จะทําให้คุณมีโควต้าฟรีที่สูงขึ้น และสามารถเลือกตั้งค่าการเรียกเก็บเงินสําหรับการใช้งานที่สูงกว่านั้นได้
ตัวอย่างข้อมูลโค้ดที่ได้จาก tasks-android-sample
com.google.api.services.tasks.Tasks service; @Override public void onCreate(Bundle savedInstanceState) { credential = GoogleAccountCredential.usingOAuth2(this, Collections.singleton(TasksScopes.TASKS)); SharedPreferences settings = getPreferences(Context.MODE_PRIVATE); credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null)); service = new com.google.api.services.tasks.Tasks.Builder(httpTransport, jsonFactory, credential) .setApplicationName("Google-TasksAndroidSample/1.0").build(); } private void chooseAccount() { startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQUEST_GOOGLE_PLAY_SERVICES: if (resultCode == Activity.RESULT_OK) { haveGooglePlayServices(); } else { checkGooglePlayServicesAvailable(); } break; case REQUEST_AUTHORIZATION: if (resultCode == Activity.RESULT_OK) { AsyncLoadTasks.run(this); } else { chooseAccount(); } break; case REQUEST_ACCOUNT_PICKER: if (resultCode == Activity.RESULT_OK && data != null && data.getExtras() != null) { String accountName = data.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME); if (accountName != null) { credential.setSelectedAccountName(accountName); SharedPreferences settings = getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putString(PREF_ACCOUNT_NAME, accountName); editor.commit(); AsyncLoadTasks.run(this); } } break; } }