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

জাভার জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরিতে থাকা OAuth 2.0 প্যাকেজগুলি জাভার জন্য সাধারণ-উদ্দেশ্যযুক্ত গুগল OAuth 2.0 ক্লায়েন্ট লাইব্রেরির উপর নির্মিত।

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

গুগল এপিআই কনসোল

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

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

পরিচয়পত্র

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

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

গুগল অ্যাপ ইঞ্জিন পরিচয়

এই বিকল্প শংসাপত্রটি গুগল অ্যাপ ইঞ্জিন অ্যাপ আইডেন্টিটি জাভা এপিআই-এর উপর ভিত্তি করে তৈরি। যে শংসাপত্রে একটি ক্লায়েন্ট অ্যাপ্লিকেশন একজন শেষ-ব্যবহারকারীর ডেটা অ্যাক্সেসের অনুরোধ করে তার বিপরীতে, অ্যাপ আইডেন্টিটি এপিআই ক্লায়েন্ট অ্যাপ্লিকেশনের নিজস্ব ডেটা অ্যাক্সেস প্রদান করে।

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() এ কল করুন এবং আপনার অ্যাপ্লিকেশনকে তাদের সুরক্ষিত ডেটাতে অ্যাক্সেস দেওয়ার জন্য ব্যবহারকারীর ব্রাউজারকে একটি অনুমোদন পৃষ্ঠায় নির্দেশ করুন।
  • এরপর গুগল অথোরাইজেশন সার্ভার ব্রাউজারটিকে আপনার অ্যাপ্লিকেশন দ্বারা নির্দিষ্ট করা রিডাইরেক্ট 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 Console- এ আপনার প্রকল্প সেট আপ করেন, তখন আপনি যে প্রবাহটি ব্যবহার করছেন তার উপর নির্ভর করে বিভিন্ন শংসাপত্রের মধ্যে থেকে নির্বাচন করেন। আরও বিস্তারিত জানার জন্য, OAuth 2.0 এবং OAuth 2.0 পরিস্থিতি সেট আপ করা দেখুন। প্রতিটি প্রবাহের জন্য কোড স্নিপেট নীচে দেওয়া হল।

ওয়েব সার্ভার অ্যাপ্লিকেশন

এই প্রবাহের প্রোটোকলটি "ওয়েব সার্ভার অ্যাপ্লিকেশনের জন্য OAuth 2.0 ব্যবহার" বিভাগে ব্যাখ্যা করা হয়েছে।

এই লাইব্রেরিটি servlet হেল্পার ক্লাস প্রদান করে যা মৌলিক ব্যবহারের ক্ষেত্রে অনুমোদন কোড প্রবাহকে উল্লেখযোগ্যভাবে সহজ করে। আপনাকে কেবল 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
  }
}

গুগল অ্যাপ ইঞ্জিন অ্যাপ্লিকেশন

অ্যাপ ইঞ্জিনে অথোরাইজেশন কোড ফ্লো প্রায় সার্ভলেট অথোরাইজেশন কোড ফ্লোর মতোই, তবে আমরা গুগল অ্যাপ ইঞ্জিনের ইউজারস জাভা এপিআই ব্যবহার করতে পারি। ইউজারস জাভা এপিআই সক্রিয় করার জন্য ব্যবহারকারীকে লগ ইন করতে হবে; ব্যবহারকারীরা যদি ইতিমধ্যে লগ ইন না করে থাকেন তবে লগইন পৃষ্ঠায় পুনঃনির্দেশিত করার বিষয়ে তথ্যের জন্য, নিরাপত্তা এবং প্রমাণীকরণ (web.xml-এ) দেখুন।

সার্ভলেট কেস থেকে প্রাথমিক পার্থক্য হল আপনি AbstractAppEngineAuthorizationCodeServlet এবং AbstractAppEngineAuthorizationCodeCallbackServlet এর কংক্রিট সাবক্লাস প্রদান করেন ( google-oauth-client-appengine থেকে। তারা abstract servlet ক্লাসগুলি প্রসারিত করে এবং Users Java API ব্যবহার করে আপনার জন্য getUserId পদ্ধতি বাস্তবায়ন করে। AppEngineDataStoreFactory ( google-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();
  }
}

অতিরিক্ত নমুনার জন্য, storage-serviceaccount-appengine-sample দেখুন।

পরিষেবা অ্যাকাউন্ট

গুগল ক্রেডেনশিয়াল পরিষেবা অ্যাকাউন্টগুলিকেও সমর্থন করে। ক্লায়েন্ট অ্যাপ্লিকেশন যে শংসাপত্রে কোনও শেষ ব্যবহারকারীর ডেটা অ্যাক্সেসের অনুরোধ করে তার বিপরীতে, সার্ভিস অ্যাকাউন্টগুলি ক্লায়েন্ট অ্যাপ্লিকেশনের নিজস্ব ডেটা অ্যাক্সেস প্রদান করে। আপনার ক্লায়েন্ট অ্যাপ্লিকেশন গুগল এপিআই কনসোল থেকে ডাউনলোড করা একটি ব্যক্তিগত কী ব্যবহার করে অ্যাক্সেস টোকেনের অনুরোধে স্বাক্ষর করে।

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

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) কল করতে পারেন।

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

এটি হল কমান্ড-লাইন অনুমোদন কোড প্রবাহ যা Using OAuth 2.0 for Installed Applications -এ বর্ণিত হয়েছে।

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

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 Console- এ নিবন্ধিত রিডাইরেক্ট 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);
}

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

@বিটা

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

যদি আপনি অ্যান্ড্রয়েডের জন্য ডেভেলপ করেন এবং আপনি যে গুগল এপিআই ব্যবহার করতে চান তা গুগল প্লে সার্ভিসেস লাইব্রেরিতে অন্তর্ভুক্ত থাকে, তাহলে সেরা পারফরম্যান্স এবং অভিজ্ঞতার জন্য সেই লাইব্রেরিটি ব্যবহার করুন। যদি আপনি অ্যান্ড্রয়েডের সাথে যে গুগল এপিআই ব্যবহার করতে চান তা গুগল প্লে সার্ভিসেস লাইব্রেরির অংশ না হয়, তাহলে আপনি জাভার জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন, যা অ্যান্ড্রয়েড ৪.০ (আইসক্রিম স্যান্ডউইচ) (বা উচ্চতর) সমর্থন করে এবং যা এখানে বর্ণনা করা হয়েছে। জাভার জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরিতে অ্যান্ড্রয়েডের জন্য সমর্থন @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;
  }
}