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 কনসোল

আপনি 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 অ্যাপ ইঞ্জিন অ্যাপ আইডেন্টিটি জাভা API-এর উপর ভিত্তি করে তৈরি। একটি ক্লায়েন্ট অ্যাপ্লিকেশন একটি শেষ-ব্যবহারকারীর ডেটা অ্যাক্সেসের জন্য অনুরোধ করে এমন প্রমাণপত্রের বিপরীতে, অ্যাপ আইডেন্টিটি API ক্লায়েন্ট অ্যাপ্লিকেশনের নিজস্ব ডেটাতে অ্যাক্সেস প্রদান করে।

AppIdentityCredential ব্যবহার করুন ( google-api-client-appengine থেকে)। এই শংসাপত্রটি অনেক সহজ কারণ Google অ্যাপ ইঞ্জিন সমস্ত বিবরণের যত্ন নেয়৷ আপনি শুধুমাত্র আপনার প্রয়োজনীয় 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 টোকেনটিকে স্বয়ংক্রিয়ভাবে "রিফ্রেশ" করার যত্ন নেয়, যার সহজ অর্থ হল একটি নতুন অ্যাক্সেস টোকেন পাওয়া। এটি একটি দীর্ঘস্থায়ী রিফ্রেশ টোকেনের মাধ্যমে করা হয়, যা সাধারণত অ্যাক্সেস টোকেনের সাথে প্রাপ্ত হয় যদি আপনি অনুমোদন কোড প্রবাহের সময় access_type=offline প্যারামিটার ব্যবহার করেন ( GoogleAuthorizationCodeFlow.Builder.setAccessType(String) দেখুন)।

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

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

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

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

অনুমোদন কোড প্রবাহ

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

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

  • শেষ-ব্যবহারকারী আপনার অ্যাপ্লিকেশনে লগ ইন করে। আপনাকে সেই ব্যবহারকারীকে একটি ব্যবহারকারী আইডির সাথে যুক্ত করতে হবে যা আপনার অ্যাপ্লিকেশনের জন্য অনন্য।
  • ব্যবহারকারীর আইডির উপর ভিত্তি করে AuthorizationCodeFlow.loadCredential(String) ) এ কল করুন যাতে শেষ-ব্যবহারকারীর শংসাপত্রগুলি ইতিমধ্যে পরিচিত কিনা। যদি তাই হয়, আমরা সম্পন্ন.
  • তা না হলে, AuthorizationCodeFlow.newAuthorizationUrl() কল করুন এবং শেষ-ব্যবহারকারীর ব্রাউজারকে তাদের সুরক্ষিত ডেটাতে আপনার অ্যাপ্লিকেশন অ্যাক্সেস দেওয়ার জন্য একটি অনুমোদন পৃষ্ঠায় নির্দেশ করুন৷
  • Google অনুমোদন সার্ভার তারপর একটি code ক্যোয়ারী প্যারামিটার সহ আপনার অ্যাপ্লিকেশন দ্বারা নির্দিষ্ট করা রিডাইরেক্ট URL-এ ব্রাউজারটিকে পুনঃনির্দেশ করবে৷ 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 অ্যাপ ইঞ্জিনের ব্যবহারকারীদের Java API ব্যবহার করতে পারি। ব্যবহারকারীদের Java API সক্রিয় করার জন্য ব্যবহারকারীকে লগ ইন করতে হবে; ব্যবহারকারীরা যদি ইতিমধ্যেই লগইন না করে থাকেন তাহলে একটি লগইন পৃষ্ঠায় পুনঃনির্দেশিত করার বিষয়ে তথ্যের জন্য, নিরাপত্তা এবং প্রমাণীকরণ (web.xml-এ) দেখুন।

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

ক্যালেন্ডার-অ্যাপেঞ্জিন-নমুনা থেকে নেওয়া উদাহরণ (সামান্য পরিবর্তিত) :

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();
  }
}

একটি অতিরিক্ত নমুনার জন্য, store-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();
...

একটি অতিরিক্ত নমুনার জন্য, store-serviceaccount-cmdline-sample দেখুন।

ছদ্মবেশ

আপনি আপনার মালিকানাধীন একটি ডোমেনে একজন ব্যবহারকারীর ছদ্মবেশ ধারণ করতে পরিষেবা অ্যাকাউন্ট প্রবাহ ব্যবহার করতে পারেন৷ এটি উপরের পরিষেবা অ্যাকাউন্ট প্রবাহের অনুরূপ, তবে আপনি অতিরিক্তভাবে GoogleCredential.Builder.setServiceAccountUser(String) কল করেন।

ইনস্টল করা অ্যাপ্লিকেশন

এটি ইনস্টল করা অ্যাপ্লিকেশনের জন্য OAuth 2.0 ব্যবহারে বর্ণিত কমান্ড-লাইন অনুমোদন কোড প্রবাহ।

প্লাস-cmdline-নমুনা থেকে উদাহরণ স্নিপেট:

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 ব্যবহারে বর্ণিত ব্রাউজার-ভিত্তিক ক্লায়েন্ট ফ্লো ব্যবহার করতে, আপনি সাধারণত এই পদক্ষেপগুলি অনুসরণ করবেন:

  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);
}

অ্যান্ড্রয়েড

@বিটা

অ্যান্ড্রয়েডের সাথে কোন লাইব্রেরি ব্যবহার করবেন:

আপনি যদি অ্যান্ড্রয়েডের জন্য বিকাশ করছেন এবং আপনি যে Google API ব্যবহার করতে চান সেটি Google Play পরিষেবা লাইব্রেরিতে অন্তর্ভুক্ত থাকে, সেরা কার্যক্ষমতা এবং অভিজ্ঞতার জন্য সেই লাইব্রেরিটি ব্যবহার করুন৷ আপনি Android এর সাথে যে Google API ব্যবহার করতে চান তা যদি Google Play Services লাইব্রেরির অংশ না হয়, তাহলে আপনি Java এর জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন, যা Android 4.0 (আইসক্রিম স্যান্ডউইচ) (বা উচ্চতর) সমর্থন করে এবং যা এখানে বর্ণনা করা হয়েছে . জাভার জন্য Google API ক্লায়েন্ট লাইব্রেরিতে Android-এর জন্য সমর্থন হল @Beta

পটভূমি:

Eclair (SDK 2.1) দিয়ে শুরু করে, অ্যাকাউন্ট ম্যানেজার ব্যবহার করে একটি অ্যান্ড্রয়েড ডিভাইসে ব্যবহারকারীর অ্যাকাউন্ট পরিচালনা করা হয়। সমস্ত অ্যান্ড্রয়েড অ্যাপ্লিকেশন অনুমোদন কেন্দ্রীয়ভাবে অ্যাকাউন্ট ম্যানেজার ব্যবহার করে 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 কনসোল থেকে API কী নির্দিষ্ট করতে হবে। অন্যথায়, অ্যাকাউন্ট ম্যানেজার আপনাকে যে টোকেন দেয় তা আপনাকে শুধুমাত্র বেনামী কোটা প্রদান করে, যা সাধারণত খুব কম হয়। বিপরীতে, একটি API কী নির্দিষ্ট করে আপনি একটি উচ্চতর বিনামূল্যের কোটা পাবেন এবং এর উপরে ব্যবহারের জন্য ঐচ্ছিকভাবে বিলিং সেট আপ করতে পারেন৷

টাস্ক-অ্যান্ড্রয়েড-নমুনা থেকে নেওয়া উদাহরণ কোড স্নিপেট:

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;
  }
}