Plumber¶
User meta-data¶
Plumber APIs can access the username and groups of the current logged in user by
parsing the RStudio-Connect-Credentials request header.
Most environments have unique usernames where each
useridentifies a single user andgroupsthe name of the groups the user is a member of. In large organizations with hundreds of users, it is possible to have two users with, for example, the same last name and initials, which could result in a duplicated username. If you're expecting such a large number of logged in users to access your Plumber API, please be sure to consult your administrator to confirm whether this condition is possible in your environment. Note thatgroupsmay suffer the same issue of duplicates names when users are authenticating against some providers, Azure in particular. If you want to ensure uniqueness of the user or group identifiers RStudio Connect should be configured with the optionAuthorization.ContentCredentialsUseGUID. When enabled, your content will receive the user and groups GUIDs instead of their names inuserandgroups. Not only are these values guaranteed to be unique but they can also be used to query for additional information about the user and groups using the Connect Server API.
Group meta-data is populated when using most authentication provider, except LDAP.
Your Plumber API should use the
HTTP_RSTUDIO_CONNECT_CREDENTIALSname to obtain theRStudio-Connect-Credentialsheader value. All HTTP headers are made available on thereqrequest object using a normalized name prefixed withHTTP_.
This simple Plumber API defines a /hello route that greets the arriving user.
library(jsonlite) library(plumber) # Returns a list containing "user" and "groups" information # populated by incoming request data. getUserMetadata <- function(req) { rawUserData <- req[["HTTP_RSTUDIO_CONNECT_CREDENTIALS"]] if (!is.null(rawUserData)) { jsonlite::fromJSON(rawUserData) } else { list() } } #* @get /hello function(req, res){ user <- getUserMetadata(req) username <- user[["user"]] if (!is.null(username)) { return(list(message = paste0("So nice to see you, ", username, "."))) } else { return(list(message = paste0("Howdy, stranger."))) } }