API Token Policies¶
New in version 2.5.
API tokens are used in Review Board 2.5+ to provide a safe form of authentication for clients without exposing any user passwords. It also offers a policy-based form of access control, limiting the capabilities of clients.
Token policies can globally limit HTTP methods, allow or block HTTP methods per-resource, or even allow or block them for specific resource item IDs. Policies are written in JSON format.
Despite the flexibility, it’s easy to write custom policies.
Policy Sections¶
All sections of a policy live in a top-level resources
key:
{
"resources": {
...
}
}
All policy sections will go under resources
.
Each section of a token policy should specify allow
and/or block
lists. These lists contain the list of all HTTP methods that are either
allowed or blocked ("POST"
, "GET"
, "PUT"
, etc.). A special value
of "*"
in the list matches all HTTP methods, which is useful for allowing
all methods by default and blocking just a few, or vice-versa.
Any part of the API that is denied by a policy will return a 101 - Permission Denied error.
Global Policy Section¶
Within resources
, you can add a global policy section, "*"
, which sets
the default allowed or blocked HTTP methods for all resources:
{
"resources": {
"*": {
"allow": [<list of methods, or "*">],
"block": [<list of methods, or "*">]
}
}
}
For example, to only allow read-only access to the API:
{
"resources": {
"*": {
"allow": ["GET", "HEAD", "OPTIONS"],
"block": ["*"]
}
}
}
Global policies apply to any and all resources, unless overridden by a more specific policy.
Resource Policy Sections¶
To allow or block access to a specific resource, add a section with the resources API policy identifier (found on any resource page in the documentation).
This may contain one or more sub-sections: "*"
, for rules applying to all
items in that resource, or "<id>"
, where the ID matches the ID of the
specific item in the resource that you want to limit access to.
The resource-global policy will apply to both lists and items.
The ID-specific policies are optional. In most cases, the resource-global policy is all that’s needed.
{
"resources": {
"*": {
"allow": [<list of methods, or "*">],
"block": [<list of methods, or "*">]
},
"<id>": {
"allow": [<list of methods, or "*">],
"block": [<list of methods, or "*">]
},
...
}
}
For example, to block all access to all repositories with the exception of allowing read access to repository ID 3:
{
"resources": {
"repository": {
"*": {
"block": ["*"]
},
"3": {
"allow": ["GET", "HEAD", "OPTIONS"]
}
}
}
}
Policy Tips¶
- To allow read access, you’ll generally want to allow
GET
,HEAD
, andOPTIONS
in theallow
list.GET
isn’t always sufficient. - Clients are expected to follow links to get to a resource. Because of this, if you’re specifically allowing access to only certain resources, you will also generally need to allow access to their parent resources.
- You probably want to allow Root List Resource and
Server Info Resource, if you’re globally blocking
GET
on all resource.