Groups Service から Cloud Identity Groups Advanced Service に移行する

Cloud Identity グループ(CIG)アドバンスト サービスは、 グループ サービス API と同等の機能を提供し、その代わりに使用できます。

CIG アドバンスト サービスで同等の機能を実現する方法については、提供されているヘルパー メソッドをご覧ください。

設定

CIG アドバンスト サービスを使用するには、まず有効にします スクリプト プロジェクト内で。

このガイドでは、メソッド シグネチャの一部を短縮するために、次の変数を定義しました。

const groups = CloudIdentityGroups.Groups;

GroupsApp メソッド

次のヘルパー メソッドは、グループ サービス GroupsApp のメソッドに対応しています。

このガイドでは、「グループ」という用語は、グループ クラス オブジェクトではなく、グループ リソースを指します。 グループ リソース はメソッドを持たない JavaScript オブジェクトですが、CIG アドバンスト サービスで使用して、グループ クラス オブジェクトと同様の情報を取得できます。

getGroupByEmail

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

getGroups

次のヘルパー メソッドは、 メンバーシップ リソースのリストを返します。 要素の group フィールドにアクセスして、名前 ID を確認します。これは、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;
}

グループ メソッド

次のヘルパー メソッドは、グループ サービス Group クラスのメソッドに対応しています。

getEmail

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

getGroups

次のメソッドは Memberships.list を使用して、指定されたグループのすべてのメンバーシップを取得します。これには、ユーザーとグループのメンバーシップが含まれます。

グループ サービス getGroups メソッドをより正確に近似するには、メンバーシップを Typeでフィルタします。 このフィールドにアクセスするには、FULL ViewMemberships.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;
}

getUsers

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

グループ サービス hasGrouphasUser はどちらも、エンティティが指定されたグループのメンバーであるかどうかを確認します。グループとユーザーはどちらもメールアドレスで表すことができるため、次のメソッドを使用して、どちらかが指定されたグループに属しているかどうかを確認できます。

/**
 * Tests if the given email has an associated direct member to the given group.
 *
 * @param {Group} group: Group resource to which the entity is 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;
}