Java-র জন্য Google API ক্লায়েন্ট লাইব্রেরির সাথে OAuth 2.0 ব্যবহার করা

এক নজরে

উদ্দেশ্য: এই ডকুমেন্ট থেকে জানা যাবে যে Google পরিষেবার সাথে OAuth 2.0 অথরাইজেশন করার জন্য কীভাবে GoogleCredential ইউটিলিটি ক্লাস ব্যবহার করতে হয়। আমাদের প্রদান করা জেনেরিক OAuth 2.0 ফাংশন সম্পর্কে তথ্যের জন্য, OAuth 2.0 এবং Java-এর জন্য Google OAuth ক্লায়েন্ট লাইব্রেরি দেখুন।

সারসংক্ষেপ: Google পরিষেবায় স্টোর করা সুরক্ষিত ডেটা অ্যাক্সেস করতে, অনুমোদনের জন্য OAuth 2.0 ব্যবহার করুন। Google APIs বিভিন্ন ধরনের ক্লায়েন্ট অ্যাপ্লিকেশনের জন্য OAuth 2.0 ফ্লোতে কাজ করে। এইসব ফ্লোতে, ক্লায়েন্ট অ্যাপ্লিকেশন এমন একটি অ্যাক্সেস টোকেনের অনুরোধ করে যা শুধুমাত্র আপনার ক্লায়েন্ট অ্যাপ্লিকেশন এবং অ্যাক্সেস করা হচ্ছে এমন সুরক্ষিত ডেটার মালিকের সাথে সম্পর্কিত। অ্যাক্সেস টোকেনটি একটি সীমিত স্কোপের সাথেও যুক্ত যা আপনার ক্লায়েন্ট অ্যাপ্লিকেশনের কোন ধরনের ডেটাতে অ্যাক্সেস আছে তা নির্ধারণ করে (যেমন "আপনার টাস্ক ম্যানেজ করুন")। OAuth 2.0-এর একটি গুরুত্বপূর্ণ লক্ষ্য হল সুরক্ষিত ডেটায় নিরাপদ ও সুবিধাজনক অ্যাক্সেস প্রদান করা এবং অ্যাক্সেস টোকেন চুরি হয়ে গেলে সম্ভাব্য প্রভাব কমানো।

Java-র জন্য Google API ক্লায়েন্ট লাইব্রেরিতে OAuth 2.0 প্যাকেজগুলি সাধারণ-উদ্দেশ্য Java-র জন্য Google OAuth 2.0 ক্লায়েন্ট লাইব্রেরি-তে তৈরি করা হয়েছে।

বিস্তারিত জানতে, নিম্নলিখিত প্যাকেজের জন্য Javadoc ডকুমেন্টেশন দেখুন:

Google API Console

Google API অ্যাক্সেস করার আগে, আপনাকে Google API Console-এ একটি প্রোজেক্ট সেট-আপ করতে হবে, যাতে আপনার ক্লায়েন্ট কোনও ইনস্টল করা অ্যাপ্লিকেশন, মোবাইল অ্যাপ্লিকেশন, ওয়েব সার্ভার বা ব্রাউজারে চলা ক্লায়েন্ট যাই হোক না কেন, আপনি অথেন্টিকেশন ও বিলিং সংক্রান্ত কাজ করতে পারেন।

আপনার ক্রেডেনশিয়াল সঠিকভাবে সেট-আপ করার নির্দেশাবলীর জন্য, API Console সহায়তা দেখুন।

ক্রেডেনশিয়াল

GoogleCredential

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-এর পরিচয়

এই বিকল্প ক্রেডেনশিয়াল Google App Engine App Identity Java API-এর উপর ভিত্তি করে তৈরি। যে ক্রেডেনশিয়ালের মাধ্যমে ক্লায়েন্ট অ্যাপ্লিকেশন কোনও ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুরোধ করে, তার থেকে আলাদাভাবে, 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();
}

ডেটা স্টোর

অ্যাক্সেস টোকেনের মেয়াদ সাধারণত ১ ঘণ্টা থাকে, যার পরে আপনি এটি ব্যবহার করার চেষ্টা করলে সমস্যা হবে। GoogleCredential অটোমেটিক টোকেন "রিফ্রেশ" করার বিষয়টি দেখে, যার অর্থ হল নতুন অ্যাক্সেস টোকেন পাওয়া। এটি দীর্ঘমেয়াদী রিফ্রেশ টোকেনের মাধ্যমে করা হয়, যা সাধারণত অ্যাক্সেস টোকেনের সাথে পাওয়া যায়, যদি আপনি অথরাইজেশন কোডের ফ্লো চলাকালীন access_type=offline প্যারামিটার ব্যবহার করেন (GoogleAuthorizationCodeFlow.Builder.setAccessType(String) দেখুন)।

বেশিরভাগ অ্যাপ্লিকেশনের ক্ষেত্রে ক্রেডেনশিয়ালের অ্যাক্সেস টোকেন এবং/অথবা রিফ্রেশ টোকেন সেভ করে রাখতে হবে। ক্রেডেনশিয়ালের অ্যাক্সেস এবং/অথবা রিফ্রেশ টোকেন বজায় রাখতে, আপনি StoredCredential সহ DataStoreFactory-এর নিজস্ব ইমপ্লিমেন্টেশন প্রদান করতে পারেন; অথবা লাইব্রেরির মাধ্যমে প্রদান করা নিম্নলিখিত ইমপ্লিমেন্টেশনের মধ্যে যেকোনও একটি ব্যবহার করতে পারেন:

  • AppEngineDataStoreFactory: Google App Engine Data Store API ব্যবহার করে ক্রেডেনশিয়াল বজায় রাখে।
  • MemoryDataStoreFactory: মেমরিতে ক্রেডেনশিয়াল "সেভ করে রাখে", যা শুধুমাত্র প্রসেসের লাইফটাইমের জন্য স্বল্প-মেয়াদী স্টোরেজ হিসেবে উপযোগী।
  • FileDataStoreFactory: একটি ফাইলে ক্রেডেনশিয়াল বজায় রাখে।

AppEngine ব্যবহারকারী: AppEngineCredentialStore বন্ধ করা হয়েছে এবং শীঘ্রই সরিয়ে দেওয়া হবে। আমরা সাজেস্ট করি যে আপনি StoredCredential-এর সাথে AppEngineDataStoreFactory ব্যবহার করুন। আপনার ক্রেডেনশিয়াল পুরনো পদ্ধতিতে স্টোর করা থাকলে, আপনি মাইগ্রেশন করার জন্য যোগ করা হেল্পার পদ্ধতি migrateTo(AppEngineDataStoreFactory) অথবা migrateTo(DataStore) ব্যবহার করতে পারবেন।

আপনি DataStoreCredentialRefreshListener ব্যবহার করতে পারেন এবং GoogleCredential.Builder.addRefreshListener(CredentialRefreshListener)) ব্যবহার করে ক্রেডেনশিয়ালের জন্য এটি সেট করতে পারেন।

অথরাইজেশন কোডের ফ্লো

ব্যবহারকারীকে Google API-তে তার সুরক্ষিত ডেটা অ্যাক্সেস করার জন্য আপনার অ্যাপ্লিকেশনকে অনুমতি দিতে অথরাইজেশন কোডের ফ্লো ব্যবহার করুন। এই ফ্লোয়ের প্রোটোকল অথরাইজেশন কোড গ্র্যান্ট-এ উল্লেখ করা আছে।

GoogleAuthorizationCodeFlow ব্যবহার করে এই ফ্লো প্রয়োগ করা হয়। ধাপগুলি হল:

  • ব্যবহারকারী আপনার অ্যাপ্লিকেশনে লগ-ইন করেন। আপনাকে সেই ব্যবহারকারীকে এমন একটি ব্যবহারকারীর আইডির সাথে যুক্ত করতে হবে যা আপনার অ্যাপ্লিকেশনের জন্য অনন্য।
  • ব্যবহারকারীর আইডি অনুযায়ী AuthorizationCodeFlow.loadCredential(String)) কল করুন যাতে ব্যবহারকারীর ক্রেডেনশিয়াল আগে থেকেই জানা আছে কিনা তা চেক করা যায়। যদি তাই হয়, তাহলে আমাদের কাজ শেষ।
  • যদি না হয়, তাহলে AuthorizationCodeFlow.newAuthorizationUrl() কল করুন এবং ব্যবহারকারীর ব্রাউজারকে একটি অনুমোদন পৃষ্ঠায় নিয়ে যান যাতে আপনার অ্যাপ্লিকেশনকে তার সুরক্ষিত ডেটা অ্যাক্সেস করার অনুমতি দেওয়া যায়।
  • Google-এর অনুমোদন সার্ভার তখন ব্রাউজারকে আপনার অ্যাপ্লিকেশনের নির্দিষ্ট করা রিডাইরেক্ট URL-এ রিডাইরেক্ট করবে, সাথে code কোয়েরি প্যারামিটারও থাকবে। AuthorizationCodeFlow.newTokenRequest(String)) ব্যবহার করে অ্যাক্সেস টোকেনের অনুরোধ করতে code প্যারামিটার ব্যবহার করুন।
  • সুরক্ষিত রিসোর্স অ্যাক্সেস করার জন্য ক্রেডেনশিয়াল স্টোর করতে ও পেতে AuthorizationCodeFlow.createAndStoreCredential(TokenResponse, String)) ব্যবহার করুন।

বিকল্প হিসেবে, আপনি GoogleAuthorizationCodeFlow ব্যবহার না করলে, লোয়ার-লেভেল ক্লাস ব্যবহার করতে পারেন:

  • ব্যবহারকারীর আইডির ভিত্তিতে স্টোর থেকে ক্রেডেনশিয়াল লোড করতে DataStore.get(String) ব্যবহার করুন।
  • ব্রাউজারকে অনুমোদনের পৃষ্ঠায় নিয়ে যেতে 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-এ অথরাইজেশন কোডের ফ্লো প্রায় সার্ভলেট অথরাইজেশন কোডের ফ্লোয়ের মতোই, তবে আমরা Google App Engine-এর Users Java API ব্যবহার করতে পারি। ব্যবহারকারী Java API চালু করার জন্য ব্যবহারকারীকে লগ-ইন করতে হবে; ব্যবহারকারী আগে থেকে লগ-ইন না করে থাকলে, তাকে লগ-ইন পৃষ্ঠায় রিডাইরেক্ট করার ব্যাপারে তথ্য পেতে, নিরাপত্তা ও যাচাইকরণ (web.xml-এ) দেখুন।

সার্ভলেট কেসের সাথে প্রাথমিক পার্থক্য হল যে আপনি AbstractAppEngineAuthorizationCodeServlet এবং AbstractAppEngineAuthorizationCodeCallbackServlet-এর (google-oauth-client-appengine থেকে) কনক্রিট সাবক্লাস প্রদান করেন। তারা অ্যাবস্ট্রাক্ট সার্ভলেট ক্লাস এক্সটেন্ড করে এবং Users Java API ব্যবহার করে আপনার জন্য getUserId পদ্ধতি প্রয়োগ করে। Google App Engine Data Store API ব্যবহার করে ক্রেডেনশিয়াল সেভ করার জন্য AppEngineDataStoreFactory (google-http-client-appengine থেকে) একটি ভালো বিকল্প।

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 Console থেকে ডাউনলোড করা ব্যক্তিগত কী ব্যবহার করে অ্যাক্সেস টোকেনের জন্য অনুরোধে স্বাক্ষর করে।

ব্যবহারের উদাহরণ:

HttpTransport httpTransport = new NetHttpTransport();
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 ব্যবহার করা-তে বর্ণনা করা হয়েছে।

ব্যবহারের উদাহরণ:

public static void main(String[] args) {
  try {
    httpTransport = new NetHttpTransport();
    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 ব্যবহার করা লিঙ্কে বর্ণিত ব্রাউজার-ভিত্তিক ক্লায়েন্ট ফ্লো ব্যবহার করতে, আপনাকে সাধারণত এইসব ধাপ অনুসরণ করতে হবে:

  1. ব্যবহারকারীর সুরক্ষিত ডেটাতে আপনার ব্রাউজার অ্যাপ্লিকেশনকে অ্যাক্সেস দিতে, GoogleBrowserClientRequestUrl ব্যবহার করে ব্রাউজারে ব্যবহারকারীকে অথরাইজেশন পৃষ্ঠায় রিডাইরেক্ট করুন।
  2. Google API কনসোলে রেজিস্টার করা রিডাইরেক্ট URI-তে URL ফ্র্যাগমেন্টে পাওয়া অ্যাক্সেস টোকেন প্রসেস করতে JavaScript-এর জন্য 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

@Beta

Android-এর সাথে কোন লাইব্রেরি ব্যবহার করতে হবে:

আপনি যদি Android-এর জন্য ডেভেলপ করেন এবং যে Google API ব্যবহার করতে চান সেটি Google Play পরিষেবা লাইব্রেরিতে অন্তর্ভুক্ত থাকে, তাহলে সেরা পারফর্ম্যান্স ও অভিজ্ঞতার জন্য সেই লাইব্রেরি ব্যবহার করুন। আপনি Android-এর সাথে যে Google API ব্যবহার করতে চান, সেটি Google Play পরিষেবা লাইব্রেরির অংশ না হলে, আপনি Java-র জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন, যা Android 4.0 (Ice Cream Sandwich) (বা তার পরবর্তী যেকোনও ভার্সন) সাপোর্ট করে এবং যার বিবরণ এখানে দেওয়া আছে। Java-র জন্য Google API ক্লায়েন্ট লাইব্রেরিতে Android-এর জন্য সহায়তা @Beta।

ব্যাকগ্রাউন্ড:

Eclair (SDK 2.1) থেকে শুরু করে, Android ডিভাইসে ব্যবহারকারীর অ্যাকাউন্ট অ্যাকাউন্ট ম্যানেজার ব্যবহার করে ম্যানেজ করা হয়। সব Android অ্যাপ্লিকেশনের অনুমোদন AccountManager ব্যবহার করে SDK-এর মাধ্যমে সেন্ট্রালি ম্যানেজ করা হয়। আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় OAuth 2.0 স্কোপ আপনি নির্দিষ্ট করেন এবং এটি ব্যবহারের জন্য একটি অ্যাক্সেস টোকেন ফেরত দেয়।

OAuth 2.0 স্কোপ authTokenType প্যারামিটারের মাধ্যমে oauth2: এবং স্কোপ হিসেবে উল্লেখ করা হয়। যেমন:

oauth2:https://www.googleapis.com/auth/tasks

এটি Google Tasks API-তে পড়া/লেখার অ্যাক্সেস নির্দিষ্ট করে। আপনার একাধিক OAuth 2.0 স্কোপের প্রয়োজন হলে, স্পেস দিয়ে আলাদা করা তালিকা ব্যবহার করুন।

কিছু API-তে বিশেষ authTokenType প্যারামিটার আছে যা কাজ করে। যেমন, "আপনার টাস্ক ম্যানেজ করুন" হল উপরে দেখানো authtokenType উদাহরণের একটি উপনাম।

এছাড়াও, আপনাকে Google API Console থেকে 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;
  }
}