Keeping credentials secure is important whether you're developing open source libraries and tools, internal integrations for your workspace, or Slack apps for distribution across workspaces.
Even if you're not working with OAuth 2.0 and user access tokens, consider the following recommendations when developing on the Slack platform.
As a Slack app developer, you'll be working with credentials issued to you from Slack, as well as token values representing members, workspaces, and specific features of your app.
Your Client ID is one piece of information used to identify your app, and frequently appears in OAuth negotiation URLs and other contexts. Your Client ID can be shared freely in code and email, and cannot be used alone to act on your app's behalf.
Your Client Secret should be treated delicately. It is how you securely identify your app's rights and identity when exchanging tokens with Slack. Do not distribute client secrets in email, distributed native apps, client-side javascript, or public code repositories.
These tokens represent specific access levels granted by the OAuth scopes you obtained.
Bot user tokens can connect to the Real Time Messaging (RTM) API and post messages on their own behalf. They can also access a subset of API methods to better understand the channels, members, and messages received as part of its activities.
User tokens, such as those received through the Add to Slack and Sign in with Slack flows are capable only of the permissions granted to it during the OAuth flow using scopes.
Store user and bot user tokens with care and never place them in a public code repository or client-side code such as Javascript.
Slack can limit use of your appβs OAuth tokens to a list of IP addresses and ranges you provide. Slack will then reject Web API method calls from unlisted IP addresses.
Restricting token use by IP address applies to token use against the Web API and the SCIM API for local or distributed apps. Allowed IP listing does not apply to incoming webhooks.
Once you provide a list of allowed IP addresses, Slack will ony accept a request to call Web API methods if it comes from one of those IP addresses. If the request matches your allowed list, Slack will execute the request and respond.
If the request originates from an IP address not listed in your allowed list, it will be rejected with the following response:
{
"ok": false,
"error": "invalid_auth"
}
To configure your allowed IP list:
You can add up to 10 entries. Each entry specifies either a CIDR range of IP addresses or a single IP address. For example:
101.101.101.106
will allow only that IP address, which we'll consider as 101.101.101.106/32
.101.101.101.0/24
will allow all 256 IP address between 101.101.101.0
and 101.101.101.255
."Local" IP addresses cannot be added to allowed lists, and IPv6 is not supported.
Slack also supports several ways to verify the authenticity of its requests to your app. Read more in the verifying requests from Slack documentation.
Read more about how to use token rotation for new and existing Slack apps.
Revoke tokens manually with the auth.revoke
method.
Slack app-based incoming webhook URLs allow posting messages only to a specific channel configured by the approving member. Their identity is always tied to the app associated with the URLs, and cannot be used as arbitrary users or on unapproved channels.
Redirect URIs appear as URLs and are safe to be part of published code. However, ensure that the redirect URIs defined in a public app are limited only to domain names in your direct control.
We recommend that after you complete local development, you should remove localhost
and related domains from your configuration list.
Storing authentication secrets is difficult, and how you do so depends on context, usage, and design requirements. While it would be great if all tokens were encrypted with individual keys controlled by the customers, most implementations do not allow that. Here are some things to consider when storing tokens to ensure we're doing everything we can to prevent accidental exposure or mix-up of usage.
The 7-Layer OSI model breaks out how apps and computers function over a network, and can provide a useful model for thinking about security at each layer.
The application layer is mostly focused on high-level APIs and how your app exposes itself to an end user. Here are some things to consider:
These layers encompass most of the non-app-based internet plumbing, including protocols such as TCP, IPv4, MAC, and Ethernet. We're going to assume for safe token usage and storage that these layers are already secure; however, there are a few points to consider, especially if you are hosting in the cloud.