Access Manager v3 API for Go SDK

Access Manager isn't enabled by default
Without it, PubNub resources on this keyset have no access controls and clients can reach channels and metadata without permission checks — including Publish, Subscribe, and all other operations. Enable Access Manager in Admin Portal before deploying to production.

Access Manager lets you enforce security controls for client access to resources on the PubNub platform. With Access Manager v3, your servers (that use a PubNub instance configured with a secret key) can grant clients tokens with embedded permissions that provide access to individual PubNub resources:

  • For a limited time period.
  • Through resource lists or regular expression (RegEx) patterns.
  • In one API request, even when permissions differ (for example, read to channel1 and write to channel2).

You can add the authorizedUuid parameter to the grant request to restrict the token usage to one client with a given userId. Once specified, only this authorizedUuid will be able to use the token to make API requests for the specified resources, according to permissions given in the grant request.

User ID / UUID

User ID is also referred to as UUID/uuid in some APIs and server responses but holds the value of the userId parameter you set during initialization.

For more information about Access Manager v3, refer to Manage Permissions with Access Manager v3.

Grant token​

Requires Access Manager add-on

This method requires that the Access Manager add-on is enabled for your key in the Admin Portal. See Enable the features your app calls.

Requires Secret Key authentication

Granting permissions to resources should be done by administrators whose SDK instance has been initialized with a Secret Key (available on the Admin Portal on your app's keyset).

The GrantToken() method generates a time-limited authorization token with an embedded access control list. The token defines time to live (TTL), AuthorizedUUID, and a set of permissions giving access to one or more resources:

  • Channels
  • ChannelGroups
  • UUIDs (other users' object metadata, such as their names or avatars)
  • Users (DataSync User objects)
  • DataSync (DataSync entities, relationships, and memberships)
  • Categories (list all channel or UUID metadata on the subscribe key, not one named resource)

Only this AuthorizedUUID will be able to use the token with the defined permissions. The authorized client will send the token to PubNub with each request until the token's TTL expires. Any unauthorized request or a request made with an invalid token will return a 403 with a respective error message.

The grant request allows your server to securely grant clients access to resources on the PubNub platform. Each resource type supports a specific set of operations:

ResourcePermissions
Channelsread, write, create, get, manage, update, join, delete
ChannelGroupsread, manage
UUIDsget, update, delete, create
Users (DataSync User objects)create, get, update, delete
DataSync (entities, relationships, memberships)create, get, update, delete
Categories (Channels, UUIDs)get only

In GrantToken(), Categories sets Channels.Get for channel metadata and UUIDs.Get for UUID metadata.

  • A category permission lets a token list all metadata of one resource type on your subscribe key. Valid categories are channels and uuids. The only permission is get (32).
  • A get permission on one named channel or user, or on a pattern, does not grant a category.
  • A token can contain only categories. It needs no resource or pattern.
  • When enumeration enforcement is enabled for a keyset, App Context list requests from a token or auth key without the matching category permission return a 403 error.

Setting Get to false leaves the category out of the token. To remove access, revoke the token.

read, write, manage, and join stay messaging concepts and are not available on Users or on any DataSync resource. create on Channels also authorizes provisioning a DataSync channel entity through CreateChannel.

DataSync user and channel objects are protected through the Users and Channels resource types, not through the DataSync scope. A grant under UUIDs does not authorize DataSync user operations, UUIDs remains scoped to App Context UUID metadata. Only DataSync entities, relationships, and memberships use the DataSync scope. UUIDs/UUIDsPattern and Users/UsersPattern are independent grant scopes, granting one does not affect the other. Refer to DataSync access control for the full permission and resource-type mapping.

For permissions and API operations mapping, refer to Manage Permissions with Access Manager v3.

Method(s)​

1pn.GrantToken().
2 UUIDs(map[string]UUIDPermissions).
3 Channels(map[string]ChannelPermissions).
4 ChannelGroups(map[string]GroupPermissions).
5 Users(map[string]UUIDPermissions).
6 DataSync(PNDataSyncTokenScopes).
7 UUIDsPattern(map[string]UUIDPermissions).
8 ChannelsPattern(map[string]ChannelPermissions).
9 ChannelGroupsPattern(map[string]GroupPermissions).
10 UsersPattern(map[string]UUIDPermissions).
11 DataSyncPattern(PNDataSyncTokenScopes).
12 DataSyncProjections(PNDataSyncProjections).
13 Categories(PNGrantCategories).
14 TTL(int).
15 AuthorizedUUID(string).
show all 18 lines
* required
ParameterDescription
UUIDs
Type: map[string]UUIDPermissions
Default:
n/a
Map of uuids to permissions. App Context UUID metadata only, does not authorize DataSync users.
Channels
Type: map[string]ChannelPermissions
Default:
n/a
Map of channel names to permissions. Also authorizes DataSync channel entities with the same id.
ChannelGroups
Type: map[string]GroupPermissions
Default:
n/a
Map of channel group ids to permissions.
Users
Type: map[string]UUIDPermissions
Default:
n/a
Map of DataSync user ids to CRUD permissions.
DataSync
Type: PNDataSyncTokenScopes
Default:
n/a
DataSync entity, relationship, and membership CRUD permissions, keyed by resource id.
UUIDsPattern
Type: map[string]UUIDPermissions
Default:
n/a
Map of uuid patterns to permissions.
ChannelsPattern
Type: map[string]ChannelPermissions
Default:
n/a
Map of channel patterns to permissions.
ChannelGroupsPattern
Type: map[string]GroupPermissions
Default:
n/a
Map of channel group patterns to permissions.
UsersPattern
Type: map[string]UUIDPermissions
Default:
n/a
Map of DataSync user id patterns to CRUD permissions.
DataSyncPattern
Type: PNDataSyncTokenScopes
Default:
n/a
DataSync entity, relationship, and membership CRUD permissions, keyed by pattern.
DataSyncProjections
Type: PNDataSyncProjections
Default:
n/a
Field-level projection assignments for DataSync resources and patterns.
Categories
Type: PNGrantCategories
Default:
n/a
Category grants that let the token list all metadata of a type on the subscribe key. Set Channels.Get to list all channel metadata and UUIDs.Get to list all UUID metadata. Unset categories are not sent.
TTL *
Type: Number
Default:
n/a
Total number of minutes for which the token is valid.
  • The minimum allowed value is 1.
  • The maximum is 43,200 minutes (30 days).
AuthorizedUUID
Type: String
Default:
n/a
Single UUID which is authorized to use the token to make API requests to PubNub.
Meta
Type: Object
Default:
n/a
Extra metadata to be published with the request. Values must be scalar only; arrays or objects are not supported.

PNDataSyncTokenScopes holds three maps, Entities, Relationships, and Memberships, each from a resource id (or pattern) to a DataSyncPermissions{ Get, Create, Update, Delete bool } value.

Projections control which payload fields a token can read and write on a DataSync resource. Each id (or pattern) maps to one projection name, __default__ is the built-in base projection, and exact id assignments take priority over pattern matches. Refer to the DataSync projections guide for how a token selects a projection.

A projection is declared per property on the class definition, so the names you can assign here are the ones the entity class or relationship class declares. A class allows at most three distinct projection names in total, including __default__, so at most two custom names besides __default__.

PNGrantCategories holds two CategoryPermissions values, Channels and UUIDs. Each has one Get flag. Setting Get sends the GET permission (32) for that category. Unset categories are omitted from the request.

PNDataSyncProjections holds two PNDataSyncProjectionScope values, Resources and Patterns, each with Entities, Users, Channels, Relationships, and Memberships maps from an id (or pattern) to a projection name. A projection assignment only decides which fields a create or update DataSync event includes for that token, refer to Add DataSync listener for the listener side.

Required key/value mappings

For a successful grant request, you must specify permissions for at least one UUID, Channel, ChannelGroup, User, or DataSync resource, either as a resource list or as a pattern (RegEx), or a DataSyncProjections assignment. A Categories grant alone also satisfies this requirement.

Sample code​

Reference code
This example is a self-contained code snippet ready to be run. It includes necessary imports and executes methods with console logging. Use it as a reference when working with other examples in this document.
1

Returns​

1PNGrantTokenResponse{
2 Data: PNGrantTokenData{
3 Message: "Success",
4 Token: "p0thisAkFl043rhDdHRsCkNyZXisRGNoYW6hanNlY3JldAFDZ3Jwsample3KgQ3NwY6BDcGF0pERjaGFuoENnctokenVzcqBDc3BjoERtZXRhoENzaWdYIGOAeTyWGJI",
5 }
6}

Other examples​

Grant an authorized client different levels of access to various resources in a single call​

The code below grants my-authorized-uuid:

  • Read access to channel-a, channel-group-b, and get to uuid-c.
  • Read/write access to channel-b, channel-c, channel-d, and get/update to uuid-d.
1

Grant an authorized client read access to multiple channels using RegEx​

The code below grants my-authorized-uuid read access to all channels that match the channel-[A-Za-z0-9] RegEx pattern.

1

Grant an authorized client different levels of access to various resources and read access to channels using RegEx in a single call​

The code below grants the my-authorized-uuid:

  • Read access to channel-a, channel-group-b, and get to uuid-c.
  • Read/write access to channel-b, channel-c, channel-d, and get/update to uuid-d.
  • Read access to all channels that match the channel-[A-Za-z0-9] RegEx pattern.
1

Grant an authorized client access to list all channel and UUID metadata​

The code below grants my-authorized-uuid the get category permission for both Channels and UUIDs, so the client can list all channel and UUID metadata on the subscribe key.

1

Grant an authorized client access to DataSync resources​

The code below grants my-authorized-uuid:

  • Get access to the DataSync user user-bob through the top-level Users scope, because DataSync users are not permissioned under DataSync.
  • Create, get, update, and delete access to the entity product-sneaker-42.
  • Create, get, update, and delete access to every membership matching the membership-.* pattern.
1

Grant a token with a field-level projection​

The code below grants my-authorized-uuid create, get, and update access to the entity product-sneaker-42, scoped to the admin projection, so events and reads through this token only see the fields the product class tags with admin.

1

Error responses​

If you submit an invalid request, the server returns HTTP 400 with a message that identifies the missing or incorrect argument. Causes can include a RegEx issue, an invalid timestamp, or incorrect permissions.

Grant token - spaces & users​

Requires Access Manager add-on

This method requires that the Access Manager add-on is enabled for your key in the Admin Portal. See Enable the features your app calls.

The grantToken() method generates a time-limited authorization token with an embedded access control list. The token defines time to live (ttl), authorizedUserId, and a set of permissions giving access to one or more resources:

  • spaces
  • users (other users' metadata, such as their names or avatars)

Only this authorizedUserId will be able to use the token with the defined permissions. The authorized client will send the token to PubNub with each request until the token's ttl expires. Any unauthorized request or a request made with an invalid token will return a 403 with a respective error message.

The grant request allows your server to securely grant your clients access to the resources within the PubNub Platform. There is a limited set of operations the clients can perform on every resource:

ResourcePermissions
spaceread, write, get, manage, update, join, delete
userget, update, delete

For permissions and API operations mapping, refer to Manage Permissions with Access Manager v3.

Method(s)​

1pn.GrantToken().
2 UsersPermissions(map[UserId]UserPermissions).
3 SpacesPermissions(map[SpaceId]SpacePermissions).
4 UserPatternsPermissions(map[string]UserPermissions).
5 SpacePatternsPermissions(map[string]SpacePermissions).
6 TTL(int).
7 AuthorizedUserId(UserId).
8 Meta(map[string]interface{}).
9 QueryParam(queryParam).
10 Execute()
* required
ParameterDescription
UsersPermissions
Type: map[UserId]UserPermissions
Default:
n/a
Map of Users to permissions.
SpacesPermissions
Type: map[SpaceId]SpacePermissions
Default:
n/a
Map of Spaces to permissions.
UserPatternsPermissions
Type: map[string]UserPermissions)
Default:
n/a
Map of User patterns to permissions.
SpacePatternsPermissions
Type: map[string]SpacePermissions
Default:
n/a
Map of Space patterns to permissions.
TTL *
Type: Number
Default:
n/a
Total number of minutes for which the token is valid.
  • The minimum allowed value is 1.
  • The maximum is 43,200 minutes (30 days).
AuthorizedUserId
Type: UserId
Default:
n/a
Single UserId which is authorized to use the token to make API requests to PubNub.
Meta
Type: Object
Default:
n/a
Extra metadata to be published with the request. Values must be scalar only; arrays or objects are not supported.
Required key/value mappings

For a successful grant request, you must specify permissions for at least one User or Space either as a resource list or as a pattern (RegEx).

Sample code​

1res, status, err := pn.GrantToken().
2 TTL(15).
3 AuthorizedUserId("my-authorized-userId").
4 SpacesPermissions(map[SpaceId]pubnub.SpacePermissions{
5 "my_spaces": {
6 Read: true,
7 },
8 }).
9 Execute()

Returns​

1PNGrantTokenResponse{
2 Data: PNGrantTokenData{
3 Message: "Success",
4 Token: "p0thisAkFl043rhDdHRsCkNyZXisRGNoYW6hanNlY3JldAFDZ3Jwsample3KgQ3NwY6BDcGF0pERjaGFuoENnctokenVzcqBDc3BjoERtZXRhoENzaWdYIGOAeTyWGJI",
5 }
6}

Other examples​

Grant an authorized client different levels of access to various resources in a single call​

The code below grants my-authorized-userId:

  • Read access to space-a, and get to userId-c.
  • Read/write access to space-b, space-c, space-d, and get/update to userId-d.
1res, status, err := pn.GrantToken().
2 TTL(15).
3 AuthorizedUserId("my-authorized-userId").
4 SpacesPermissions(map[SpaceId]pubnub.SpacePermissions{
5 "space-a": {
6 Read: true,
7 },
8 "space-b": {
9 Read: true,
10 Write: true,
11 },
12 "space-c": {
13 Read: true,
14 Write: true,
15 },
show all 30 lines

Grant an authorized client read access to multiple spaces using RegEx​

The code below grants my-authorized-userId read access to all channels that match the space-[A-Za-z0-9] RegEx pattern.

1res, status, err := pn.GrantToken().
2 TTL(15).
3 AuthorizedUserId("my-authorized-userId").
4 SpacePatternsPermissions(map[string]pubnub.SpacePermissions{
5 "^space-[A-Za-z0-9]*$": {
6 Read: true,
7 },
8 }).
9 Execute()

Grant an authorized client different levels of access to various resources and read access to spaces using RegEx in a single call​

The code below grants the my-authorized-userId:

  • Read access to space-a and userId-c.
  • Read/write access to space-b, space-c, space-d, and get/update to userId-d.
  • Read access to all channels that match the space-[A-Za-z0-9] RegEx pattern.
1res, status, err := pn.GrantToken().
2 TTL(15).
3 AuthorizedUserId("my-authorized-userId").
4 SpacesPermissions(map[string]pubnub.SpacePermissions{
5 "space-a": {
6 Read: true,
7 },
8 "space-b": {
9 Read: true,
10 Write: true,
11 },
12 "space-c": {
13 Read: true,
14 Write: true,
15 },
show all 35 lines

Error responses​

If you submit an invalid request, the server returns HTTP 400 with a message that identifies the missing or incorrect argument. Causes can include a RegEx issue, an invalid timestamp, or incorrect permissions.

Revoke token​

Requires Access Manager add-on

This method requires that the Access Manager add-on is enabled for your key in the Admin Portal. See Enable the features your app calls.

Enable token revoke

To revoke tokens, you must first enable this feature on the Admin Portal. To do that, navigate to your app's keyset and mark the Revoke v3 Token checkbox in the ACCESS MANAGER section.

The RevokeToken() method allows you to disable an existing token and revoke all permissions embedded within. You can only revoke a valid token previously obtained using the GrantToken() method.

Use this method for tokens with ttl less than or equal to 30 days. If you need to revoke a token with a longer ttl, contact support.

For more information, refer to Revoke permissions.

Method(s)​

1pn.RevokeToken().
2 Token(string)
* required
ParameterDescription
Token *
Type: string
Default:
n/a
Existing token with embedded permissions.

Sample code​

1

Returns​

The RevokeToken() operation returns an empty PNRevokeTokenResponse interface.

Error Responses​

If you submit an invalid request, the server returns an error status code with a descriptive message informing which of the provided arguments is missing or incorrect. Depending on the root cause, this operation may return the following errors:

  • 400 Bad Request
  • 403 Forbidden
  • 503 Service Unavailable

Parse token​

The ParseToken() method decodes an existing token and returns the object containing permissions embedded in that token. The client can use this method for debugging to check the permissions to the resources or find out the token's TTL details.

Import the pubnub package before you use the ParseToken() method:

1import (
2 pubnub "github.com/pubnub/go/v5")

Method(s)​

1pubnub.ParseToken(token string)
* required
ParameterDescription
token *
Type: String
Default:
n/a
Current token with embedded permissions.

Sample code​

1

Returns​

1PNToken{
2 Version: 2,
3 Timestamp: 1619718521,
4 TTL: 15,
5 AuthorizedUUID: "user1",
6 Resources: PNTokenResources{
7 Channels: make[string]ChannelPermissions{
8 Read: true,
9 Write: true,
10 Delete: true,
11 Get: true,
12 Manage: true,
13 Update: true,
14 Join: true,
15 },
show all 64 lines

Categories​

Categories on the returned PNToken is always set, with the same PNGrantCategories shape used by the grant. Channels.Get is true only when the token can list all channel metadata, and UUIDs.Get is true only when it can list all UUID metadata. An absent category is false, not nil. Named resource permissions do not change these flags.

The code below parses a token and reads its category permissions.

1

DataSync permissions and projections​

Resources.Users, Resources.DataSync, and their pattern counterparts decode the DataSync CRUD permissions embedded in the token, and Projections decodes the field-level projection assignments from the token's meta.pn-projections block. The DataSync, Users, and Projections fields appear only when the token actually granted them, DataSync is the zero-value PNDataSyncTokenScopes and Projections is nil otherwise, so guard the access when you read one.

Error Responses​

If you receive an error while parsing the token, it may suggest that the token is damaged. In that case, request the server to issue a new one.

Set token​

The SetToken() method is used by the client devices to update the authentication token granted by the server.

Method(s)​

1pn.SetToken(token string)
* required
ParameterDescription
token *
Type: String
Default:
n/a
Current token with embedded permissions.

Sample code​

1

Returns​

This method doesn't return any response value.

Was this page useful?

Last updated on