Thursday Oct 08, 2009
The OpenSSO REST Interfaces in Black / White
A RESTful web service assumes all components are exposed using the same, uniform application interface. (An interesting article on other requirements of REST can be read here.) From this high-level HTTP accomplishes this uniformity with its methods such as GET and POST. Thus calling a RESTful web service requires the simple construction of a URL.
OpenSSO exposes a number of interfaces that support a REST architecture. These operations are supported out of the box so no special configurations are required. The format of the URL is:http://OpenSSO-host:OpenSSO-port/opensso/identity/OpenSSO-REST-interface?parameter1=value1¶meter2=value2¶meterN=valueN
NOTE: If the value of the parameters (value1, value2, ..., valueN) contains unsafe characters, they need to be URL encoded when forming the REST URL. For example, an equal sign (=) needs to be replaced with %3D or an ampersand (&) needs to be replaced with %26.
The following sections contain information on invoking the available OpenSSO REST interfaces.
- Authentication
- Token Validation
- Logout
- Authorization
- Logging
- Searching for Identity Types
- Display Identity Data
- Display Particular Identity Data
- Creating Identity Types
- Updating Identity Data
- Deleting an Identity Profile
Authentication
Theauthenticate REST interface opens an HTTP connection to authenticate a user with a POST operation. The following URL defines a username and password that will be authenticated at the OpenSSO root realm - by default, / (Top Level Realm).
http://OpenSSO-host:OpenSSO-port/opensso/identity/authenticate?username=jning&password=pwjning
You can also add the optional uri parameter to the URL. The value of this parameter would be one or more of the URL parameters documented in Accessing the OpenSSO Enterprise Authentication Service User Interface with a Login URL. For example, the following URL will authenticate the user to a specific sub realm.
http://OpenSSO-host:OpenSSO-port/opensso/identity/authenticate?username=jning&password=pwjning&uri=realm=sub_realm_name
You can define additional parameters. For example, the following URL will authenticate the user to a specific sub realm using the specified authentication chain (ldapService, for example).
http://OpenSSO-host:OpenSSO-port/opensso/identity/authenticate?username=jning&password=pwjning&uri=realm=sub_realm_name&service=ldapService
After successful authentication, a token string is returned to represent the authenticated user for other REST operations. Various exceptions might also be thrown such as UserNotFound and InvalidPassword. A generic exception is provided if unable to reach OpenSSO or for other fatal errors.
NOTE: The token string returned is also applied as the value of the subjectid in some OpenSSO REST operations like logout and authorize.
Token Validation
TheisTokenValid REST interface validates the token using the POST operation. The following URL defines a tokenid that will be validated by OpenSSO.
http://OpenSSO-host:OpenSSO-port/opensso/identity/isTokenValid?tokenid=AQIC5wM2LY4SfczeSHZ5cHJMmQYU3f5imB2fBBTpkCXADS0=-AT-AAJTSQACMDE=#
The operation returns a value of true or false.
Logout
Thelogout REST interface validates the token using the POST operation. The following URL defines a tokenid that will be validated by OpenSSO.
http://OpenSSO-host:OpenSSO-port/opensso/identity/logout?subjectid=AQIC5wM2LY4SfczeSHZ5cHJMmQYU3f5imB2fBBTpkCXADS0=-AT-AAJTSQACMDE=#
The operation invalidates the tokenid and logs the user out.
Authorization
Theauthorize REST interface will verify against created policies that the user is authorized to perform a particular operation (GET or POST) on a particular HTTP resource. The following URL defines a user (subjectid) that wants to POST (action) to the specified resource (uri).
http://OpenSSO-host:OpenSSO-port/opensso/identity/authorize?uri=http://www.sun.com:90&action=POST&subjectid=AQIC5wM2LY4SfczeSHZ5cHJMmQYU3f5imB2fBBTpkCXADS0=@AAJTSQACMDE=#
The operation returns a value of true or false. If the user is not authorized, an exception is thrown. Assuming a policy has been created to allow authenticated users to POST to the defined resource (in this case, http://www.sun.com:90), the above URL would return true.
Logging
Thelog REST interface will log to the OpenSSO Logging Service. The URL needs to be populated with the following information.
appiddefines thetokenidof the user with the necessary permissions to write to the log; for exampleamadmin.subjectiddefines thetokenidof the user about whom the log record is being written.lognameis the module name of the OpenSSO component invoking the Logging Service; for example,amAuthentication.messageis the data being logged.
http://OpenSSO-host:OpenSSO-port/opensso/identity/log?appid=AQIC5wM2LY4Sfcz24GvZCdv6ie9dTJBa3Co7Rn2QUjKCDuM=@AAJTSQACMDE=#&subjectid=AQIC5wM2LY4SfcwTCcRKSDXEsiJXt71PDAUmN1bm/draPZI=@AAJTSQACMDE=#&logname=amAuthentication&message=test
Searching Identity Types
Thesearch REST interface will search the configured database for particular identities. The URL needs to be populated with the following information.
filterdefines a set of criteria that controls what is returned by the operation.attributes_namedefines one or more LDAP attributes for which to search.attribute_values_value-of-attributes_namedefines the value of the attribute (defined byattributes_name) that is being searched.admindefines thetokenidof the user with the necessary permissions to search; for exampleamadmin.
string=wsc, string=wsp, and string=SecurityTokenService.
http://OpenSSO-host:OpenSSO-port/opensso/identity/search?filter=*&attributes_names=objecttype&attributes_values_objecttype=agent&admin=AQIC5wM2LY4SfcxCWBCNON1gTsaMaHISbYmTyYosv8pCPVw=@AAJTSQACMDE=#
This example would return all user entries.
http://OpenSSO-host:OpenSSO-port/opensso/identity/search?filter=*&attributes_names=objectclass&attributes_values_objectclass=person&admin=AQIC5wM2LY4SfcxCWBCNON1gTsaMaHISbYmTyYosv8pCPVw=@AAJTSQACMDE=#
Display Identity Data
Theattributes REST interface will search the configured database for identity information about the defined subjectid. It retrieves roles and common attributes (including first name and last name) and is used by applications to obtain a user's profile for application-controlled authorization. Optionally, the URL can take one or more attribute_names parameters to define which attribute values will be returned; if attribute_names is not defined it would return all the attributes in the profile. This is an example URL that would return the specified user's LDAP profile.
http://OpenSSO-host:OpenSSO-port/opensso/identity/attributes?attributes_names=uid&subjectid=AQIC5wM2LY4Sfcz6eH4abOQ0el7pnDqmOn6nnn1nrcuE8/w=@AAJTSQACMDE=#
The URL might return something like this:
userdetails.token.id=AQIC5wM2LY4Sfcz6eH4abOQ0el7pnDqmOn6nnn1nrcuE8/w=@AAJTSQACMDE=#
userdetails.attribute.name=sn
userdetails.attribute.value=jning
userdetails.attribute.name=cn
userdetails.attribute.value=jning
userdetails.attribute.name=objectclass
userdetails.attribute.value=sunFederationManagerDataStore
userdetails.attribute.value=top
userdetails.attribute.value=iplanet-am-managed-person
userdetails.attribute.value=iplanet-am-user-service
userdetails.attribute.value=organizationalperson
userdetails.attribute.value=inetadmin
userdetails.attribute.value=iPlanetPreferences
userdetails.attribute.value=person
userdetails.attribute.value=inetuser
userdetails.attribute.value=sunAMAuthAccountLockout
userdetails.attribute.value=sunIdentityServerLibertyPPService
userdetails.attribute.value=inetorgperson
userdetails.attribute.value=sunFMSAML2NameIdentifier
userdetails.attribute.name=userpassword
userdetails.attribute.value={SSHA}XhiE0RMwO/D7SSQ5fYLrTlFjmbHmYbQkIU43FA==
userdetails.attribute.name=uid
userdetails.attribute.value=jning
userdetails.attribute.name=givenname
userdetails.attribute.value=jning
userdetails.attribute.name=inetuserstatus
userdetails.attribute.value=Active
Display Particular Identity Data
Theread REST interface will search the configured database for particular identity information about the LDAP user defined by name. The attributes_names parameter defines one or more LDAP attributes for which to search. This is an example URL that would return the specified user's LDAP profile.
http://OpenSSO-host:OpenSSO-port/opensso/identity/read?name=jning&attributes_names=uid&admin=AQIC5wM2LY4SfcxCWBCNON1gTsaMaHISbYmTyYosv8pCPVw=@AAJTSQACMDE=#
The URL might return something like this:
identitydetails.name=jning identitydetails.type=user identitydetails.realm=dc=opensso,dc=java,dc=net identitydetails.attribute= identitydetails.attribute.name=uid identitydetails.attribute.value=jning
Creating Identity Types
Thecreate REST interface will create the defined identity type in the configured data store. The URL needs to be populated with the following information. Note the values for these parameters in the sample URLs below.
identity_namedefines a easily-readable name for the identity.identity_attribute_namesdefines one or more LDAP attributes to be created for the identity.identity_attribute_values_value-of-identity_attribute_namesdefines the value of the attribute (defined byattributes_name) being created.identity_realmdefines the realm in which the identity is created.identity_typedefines the type of identity being created.admindefines thetokenidof the user with the necessary permissions to create; for exampleamadmin.
search REST interface to verify its creation.
http://OpenSSO-host:OpenSSO-port/opensso/identity/create?identity_name=rest_user&identity_attribute_names=userpassword&identity_attribute_values_userpassword=secret123&identity_attribute_names=sn&identity_attribute_values_sn=sn_of_rest_user&identity_attribute_names=cn&identity_attribute_values_cn=cn_of_rest_user&identity_realm=/&identity_type=user&admin=AQIC5wM2LY4Sfcwbg2YdVMaYsfEqdxHDMUc47WSLBNTOlrk=@AAJTSQACMDE=#
The following URL would create a web agent profile for Policy Agent 3.0 types. Use the search REST interface to verify its creation.
http://OpenSSO-host:OpenSSO-port/opensso/identity/create?&identity_name=webagent&identity_realm=/&identity_type=AgentOnly&identity_attribute_names=userpassword&identity_attribute_values_userpassword=secret123&identity_attribute_names=AgentType&identity_attribute_values_AgentType=WebAgent&identity_attribute_names=SERVERURL&identity_attribute_values_SERVERURL=http://web-agent-host:web-agent-port/opensso
The following URL would create a J2EE agent profile for Policy Agent 3.0 types. Use the search REST interface to verify its creation.
http://OpenSSO-host:OpenSSO-port/opensso/identity/create?&identity_name=j2eeagent&identity_realm=/&identity_type=AgentOnly&identity_attribute_names=userpassword&identity_attribute_values_userpassword=secret123&identity_attribute_names=AgentType&identity_attribute_values_AgentType=J2EEAgent&identity_attribute_names=SERVERURL&identity_attribute_values_SERVERURL=http://J2EE-agent-host:J2EE-agent-port/opensso&identity_attribute_names=AGENTURL&identity_attribute_values_AGENTURL=http://OpenSSO-host:OpenSSO-port/opensso
The following URL would create a 2.2 agent profile. Use the search REST interface to verify its creation.
http://OpenSSO-host:OpenSSO-port/opensso/identity/create?identity_name=webagent70&identity_attribute_names=userpassword&identity_attribute_values_userpassword=secret123&identity_realm=/&identity_type=Agent&admin=AQIC5wM2LY4Sfcwbg2YdVMaYsfEqdxHDMUc47WSLBNTOlrk=@AAJTSQACMDE=#
Updating Identity Data
Theupdate REST interface will update an identity with the information defined in the URL. The following URL would update the user profile with an email address.
http://OpenSSO-host:OpenSSO-port/opensso/identity/update?identity_name=rest_user&identity_attribute_names=mail&identity_attribute_values_mail=restUser@rest-DOT-org&admin=AQIC5wM2LY4Sfcwbg2YdVMaYsfEqdxHDMUc47WSLBNTOlrk=@AAJTSQACMDE=#
Use the read REST interface to verify the update.
Deleting an Identity Profile
Thedelete REST interface will remove the identity profile (defined as the value of the identity_name parameter) from the user data store. The following URL would delete the rest_user profile previously created.
http://OpenSSO-host:OpenSSO-port/opensso/identity/delete?identity_name=rest_user&admin=AQIC5wM2LY4Sfcwbg2YdVMaYsfEqdxHDMUc47WSLBNTOlrk=@AAJTSQACMDE=#&identity_type=user
Use the search REST interface to verify the deletion.
Now check out the not-most-recent-single-but-still-great-video from The Raveonettes: Black / White.
Posted at 02:47PM Oct 08, 2009 by Michael Teger in Sun | Comments[7]

Is this API really RESTful? It is more like RPC-style for me, such as:
1) parameters in URI, not unique URI endpoint for individual resources.
2) use HTTP POST verb all over the place.
Posted by Edward on October 09, 2009 at 01:18 AM PDT #
Hi,
I've been trying to use OpenSSO Identity Services to hit my Agent protected webapp.
I hit the authenticate endpoint and then set the tokenid that it returns as the iPlanetDirectoryPro cookie as per Pat Patterson's instructions.
What I don't see happening is OpenSSO setting the J2EE Security Principal on the server. I have the Agent Authentication mode set to ALL.
Have you ever tried this and how would I get this to work properly?
Thanks!!
Posted by Ronak Patel on October 09, 2009 at 02:40 AM PDT #
Ed, this is quite RESTful. The access seemingly emulates the WWW which is also quite RESTful. You should check out the link in the first paragraph for more info. This link on wikipedia contrasts the styles in a few sentences: http://en.wikipedia.org/wiki/Web_service#Styles_of_use
Ronak, I would suggest you send your question to the OpenSSO alias. I do not have an agent in my setup and can't answer your question. Sorry.
Posted by DocTeger on October 09, 2009 at 06:23 AM PDT #
I'm confused. Is this API shipping already or still in the formative stages? Does this interface really stipulate that the password be provided in the query string? Besides the security vulnerabilities, what about other credential types? Can I only get a token from this endpoint using a username/password? What about a OTP, SAML tokens from a federation partner, etc.?
BTW, this is RPC not REST.
Posted by Travis Spencer on October 28, 2009 at 10:51 PM PDT #
Hi, nice post. I was wondering how I can create or delete new policies outside the admin console using a sort of APIs like those. Is it possible? Thanks in advance!
Posted by Marco on October 29, 2009 at 09:03 AM PDT #
Travis, the OpenSSO REST interfaces were first shipped in 8.0. To date, REST authentication only works with authentication modules that accept a simple user name and password. For info on security, you might check out this article on OAuth and REST: http://developers.sun.com/identity/reference/techart/restwebservices.html As for RPC or REST, search the string 'is REST also RPC' and notice that many think that.
hth.
Posted by Michael Teger on October 30, 2009 at 08:39 AM PDT #
Hi Marco. Thanks for your comment. There is no REST interface for policy creation/deletion at this time. I do know we are working on one for policy evaluation but it is still in the early stages of development.
Posted by Michael Teger on October 30, 2009 at 08:41 AM PDT #