مهاجرت از سرویس گروه ها به سرویس پیشرفته Cloud Identity Groups، مهاجرت از سرویس Groups به سرویس پیشرفته Cloud Identity Groups، مهاجرت از سرویس Groups به سرویس پیشرفته Cloud Identity Groups

سرویس پیشرفته گروه‌های هویت ابری (CIG) ویژگی‌هایی معادل با API سرویس گروه‌ها ارائه می‌دهد و می‌تواند به جای آن مورد استفاده قرار گیرد.

برای یادگیری نحوه دستیابی به قابلیت‌های معادل از طریق سرویس پیشرفته CIG، به روش‌های کمکی ارائه شده مراجعه کنید.

راه‌اندازی

برای استفاده از سرویس پیشرفته CIG، ابتدا آن را در پروژه اسکریپت خود فعال کنید .

برای کوتاه کردن برخی از امضاهای متد در این راهنما، متغیر زیر را تعریف کردیم:

const groups = CloudIdentityGroups.Groups;

متدهای GroupsApp

متدهای کمکی زیر با متدهای کمکی GroupsService در GroupsApp مطابقت دارند.

در این راهنما، اصطلاح گروه به یک منبع گروهی (Group Resource) اشاره دارد، نه یک شیء کلاس گروهی (Group Class ). منابع گروهی ، اشیاء جاوا اسکریپتی هستند که متد ندارند، اما می‌توانند در سرویس پیشرفته CIG برای بازیابی اطلاعات مشابه اشیاء کلاس گروهی استفاده شوند.

دریافت گروه با ایمیل

/**
 * Given a group's email, returns that group's resource
 *
 * @param {String} email: The email address to lookup a group by
 * @return {Group} group: The group resource associated with the email
 */
function groupsAppGetGroupByEmail(email) {
  // Retrieve the name ID of the group
  const groupName = groups.lookup({
    'groupKey.id': email,
    'groupKey.namespace': ''  // Optional for google groups, dynamic groups, and security groups
                              // Necessary for identity-mapped groups (see https://developers.google.com/cloud-search/docs/guides/identity-mapping)
  }).name;

  // Retrieve the group resource
  return groups.get(groupName);
}

گروه‌های دریافت

متد کمکی زیر لیستی از منابع عضویت را برمی‌گرداند. برای یافتن شناسه نام یک عنصر، به فیلد group آن دسترسی پیدا کنید. این برای بسیاری از متدهای سرویس پیشرفته CIG مفید است. به طور مشابه، برای یافتن ایمیل یک عنصر، به groupKey.id آن دسترسی پیدا کنید.

/**
 * Retrieves all the membership relation resources to groups which you are a
 * direct member (or a pending member).
 *
 * @return {Array<MembershipRelation>} groups : List of direct memberships where
 * you are the member.
 */
function groupsAppGetGroups() {
  const myEmail = Session.getActiveUser().getEmail();
  let pageToken = '';
  let membershipList = [];

  do {
    const queryParams = {
      query:`member_key_id=='${myEmail}'`,
      pageToken:pageToken
    };
    const searchResult = groups.Memberships.searchDirectGroups('groups/-', queryParams);
    membershipList = membershipList.concat(searchResult.memberships);
    pageToken = searchResult.nextPageToken;
  } while (pageToken);

  return membershipList;
}

روش‌های گروهی

متدهای کمکی زیر مربوط به متدهای Groups Class Service هستند.

دریافت ایمیل

/**
 * Gets a group's email address
 *
 * @param {Object} group: A group resource
 * @return {String} email: The email associated with the group resource.
 */
function getEmail(group) {
  return group.groupKey.id;
}

گروه‌های دریافت

روش زیر از Memberships.list استفاده می‌کند که هر عضویتی را به گروه داده شده واکشی می‌کند. این می‌تواند شامل عضویت کاربران و همچنین گروه‌ها باشد.

برای تقریب بهتر متد getGroups در سرویس گروه‌ها، می‌توانیم عضویت‌ها را بر اساس Type فیلتر کنیم. ما با ارائه یک FULL View به عنوان پارامتر پرس‌وجو به Memberships.list یا با انجام یک Memberships.lookup جداگانه برای هر عضویت داده شده، به این فیلد دسترسی پیدا می‌کنیم.

/**
 * Fetch a list of memberships with provided group as its parent
 *
 * @param {Group} group: A group resource
 * @return {Array<Membership>} membershipList: The memberships where the parent
 * is the provided group and member is a also a group.
 */
function getGroups(group) {
  let membershipList = [];
  let pageToken = '';

  do {
    // Fetch a page of memberships
    const queryParams = {
      view: 'FULL',
      pageToken: pageToken
    }
    const response = groups.Memberships.list(group.name, queryParams);

    // Filter non-group memberships
    const onlyGroupMemberships = response.memberships.filter(
      membership => membership.type == 'GROUP'
    );
    membershipList = membershipList.concat(onlyGroupMemberships);

    // Set up next page
    pageToken = response.nextPageToken;
  } while(pageToken);

  return membershipList;
}

getRole و getRoles

در حالی که سرویس گروه‌ها ممکن است فقط نقش با بالاترین اولویت را در getRole() برگردانده باشد، فیلد roles در یک منبع عضویت شامل یک عنصر جداگانه برای هر نقشی است که عضو واجد شرایط آن است (مثال: MEMBER، OWNER، ADMIN).

/**
 * Retrieve the membership roles of a member to a group.
 *
 * @param {Group} containingGroup: The group whom the member belongs to
 * @param {String} email: The email address associated with a member that
 * belongs to the containingGroup
 * @return {Array<Role>} roles: List of roles the member holds with respect to
 * the containingGroup.
 */
function getRoleWithEmail(containingGroup, email) {
  // First fetch the membership
  const membershipName = groups.Memberships.lookup(containingGroup.name, { 'memberKey.id': email }).name;
  const membership = groups.Memberships.get(membershipName);

  // Then retrieve the role
  return membership.roles;
}

/**
 * Retrieve the membership roles of a member to a group.
 *
 * @param {Group} containingGroup: The group resource whom the member belongs to
 * @param {User} user: The user associated with a member that belongs to the
 * containingGroup
 * @return {Array<Role>} roles: List of roles the member holds with respect to
 * the containingGroup
 */
function getRoleWithUser(containingGroup, user) {
  return getRoleWithEmail(containingGroup, user.getEmail());
}

/**
 * Retrieve the membership roles of a group of members to a group
 *
 * @param {Group} containingGroup: The group resource to which roles are
 * relevant
 * @param {Array<User>} users: List of users to fetch roles from
 * @return {Array<Array<Role>>} roles: A list where every element is a list of
 * roles of member to the containingGroup
 */
function getRoles(containingGroup, users) {
  let roles = [];
  for (const user of users) {
    roles.push(getRoleWithUser(containingGroup, user));
  }
  return roles;
}

دریافت کاربران

مشابه رویکرد ما در getGroups ، می‌توانیم عضویت‌های یک گروه را با Memberships.list دریافت کنیم و نتایج را فیلتر کنیم تا فقط Type هدف خود را حفظ کنیم.

/**
 * Given a group, retrieve its direct members and banned members of the group
 * that have a known corresponding Google Account.
 *
 * @param {Group} group: The group Resource whom the users being queried belong
 * to
 * @return {Array<String>} users: A list of emails associated with members of
 * the given group
 */
function getUsers(group) {
  let userList = [];
  let pageToken = '';

  do {
    // Fetch a page of memberships from the group
    const queryParams = {
      view: 'FULL',
      pageToken: pageToken
    }
    const listResponse = groups.Memberships.list(group.name, queryParams);

    // Filter non-users and keep member emails
    const users = listResponse.memberships
      .filter(membership => membership.type == 'USER')
      .map(membership => membership.preferredMemberKey.id);
    userList = userList.concat(users);

    // Prepare next page
    pageToken = listResponse.nextPageToken;
  } while (pageToken);

  return userList;
}

hasGroup و hasUser

هر دو سرویس Groups hasGroup و hasUser تایید می‌کنند که آیا یک موجودیت عضو یک گروه مشخص است یا خیر. با توجه به اینکه هم یک گروه و هم یک کاربر می‌توانند با یک آدرس ایمیل نمایش داده شوند، می‌توان از روش زیر برای تایید تعلق هر یک از آنها به یک گروه مشخص استفاده کرد.

/**
 * Tests if the given email has an associated direct member to the given group.
 *
 * @param {Group} group: Group resource to which the entity is being checked as
 * a member
 * @param {String} email: Email that can represent a Group or User entity
 * @return {Boolean} isMember: Whether the entity is a direct member to the
 * group or not
 */
function checkDirectGroupMembership(group, email) {
  try {
    groups.Memberships.lookup(group.name, {'memberKey.id': email});

  } catch(e) {
    // Log failure if exception is not related to membership existence
    if (!e.message.includes('Membership does not exist.')) {
      console.error(e);
    }
    return false;
  }
  return true;
}