Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
xps upload
khazelton committed Apr 10, 2020
1 parent 24b75c1 commit 885e634
Showing 17 changed files with 1,734 additions and 0 deletions.
36 changes: 36 additions & 0 deletions README.adoc
@@ -0,0 +1,36 @@
= Internet2 Trust and Identity Schema

:Email: hazelton@internet2.edu
:Date: 2020-04-08
:Revision: 04
:SelfLink: https://github.internet2.edu/TIER/schema
:Editor: Keith Hazelton
:Email: hazelton@internet2.edu

[NOTE]
====
Revision: {Revision} +
{Date} +
Self-link: {SelfLink} +
Editor: {Editor}, {Email}
====

==== Person Schema

Draft Minimal Registry Person Schema from InCommon Trusted Access Platform link:schema/minimalRegistryPerson.json[(json)] +
SOR-Registry Core Person Schema link:https://spaces.at.internet2.edu/display/cifer/SOR-Registry+Core+Schema+Specification[(wiki)]


==== Colorado School of Mines Banner-derived Person Schema and examples

Example Banner Person Data Example in SPML link:schema/bannerSoMschema.adoc[(adoc)] +
Example Banner Person Data Example simplified link:schema/bannerSoMattributes.adoc[(adoc)] +
Example Banner Person Data Example in yaml link:schema/bannerSoMattributes.yaml[(yaml)] +
Example Banner Person Data Example in json link:schema/bannerSoMattributes.json[(json)] +
Derived JSON Schema for Banner Person Instances link:schema/bannerSoMjsonSchema.json[(json)]

==== References link:references.adoc[(adoc)]

==== Issues link:issues.adoc[(adoc)]


63 changes: 63 additions & 0 deletions attributes/attributeClasses.adoc
@@ -0,0 +1,63 @@
Attribute Classes

AccessibilityProfile +
Account +
Address +
Affiliation +
Age +
Anniversary +
Application +
Assurance +
BirthPlace +
Birthdate +
Certification +
Citizenship +
Clearance +
Contact +
Country +
Course +
DN +
Date +
DeathDate +
Description +
Email +
EmailMetadata +
Entitlement +
Ethnicity +
Format +
Gender +
Group +
HostName +
Identifier +
Jurisdiction +
Language +
Link +
Locale +
Location +
Manager +
Name +
Note +
Operational +
Organization +
Password +
Phone +
Photo +
PhysicalCharacteristic +
Pointer +
Position +
Preference +
Presence +
Privacy +
Profile +
Relationship +
Residency +
Role +
Salutation +
Search +
StateOrProvince +
StatusMessage +
SuperiorNode +
Tag +
Timezone +
URL +
VitalEvent +
13 changes: 13 additions & 0 deletions data/person1.json
@@ -0,0 +1,13 @@
{
"name": {
"lastName": "Johnson",
"firstName": "Joe"
},
"birthDate": "1965-08-10",
"username": "jjohnson",
"institutionalId": "34-765554",
"email": {
"emailAddress": "jjohnson@goo.edu",
"emailType": "primary"
}
}
21 changes: 21 additions & 0 deletions data/person2.json
@@ -0,0 +1,21 @@
{
"name": {
"lastName": "Jansen",
"firstName": "Jo"
},
"birthDate": "1955-12-10",
"username": "jjansen",
"institutionalId": "34-546877",
"identifier": [
{"id": "357A225",
"source": "SIS"
},
{
"id": "jansen121",
"source": "HR"
} ],
"email": {
"emailAddress": "jjansen@goo.edu",
"emailType": "primary"
}
}
4 changes: 4 additions & 0 deletions issues.adoc
@@ -0,0 +1,4 @@
Current Issues
--------------
- Create db schema to carry Banner person instances
- Choose approach for ConnID connector that inputs person JSON and provisions to LDAP
21 changes: 21 additions & 0 deletions references.adoc
@@ -0,0 +1,21 @@
References
====
This Repository
=====
* link:README.adoc[]
* link:attributes/attributeClasses.adoc[Attribute Classes that can be used to categorize individual attributes]
External Links
=====
* https://json-schema.org/[Latest JSON Schema Specification link]
* https://spacetelescope.github.io/understanding-json-schema/UnderstandingJSONSchema.pdf[Understanding JSON Schema]; Good intro but somewhat dated: Refers to Draft 4, current is Draft 7
* Phil Sturgeon’s https://philsturgeon.uk/api/2018/04/13/openapi-and-json-schema-divergence-solved/[two-part article] on
the convergence between http://json-schema.org/[JSON Schema] and https://www.openapis.org/[OAI 3]
* A little https://github.com/wework/json-schema-to-openapi-schema[NodeJS package] to convert JSON Schema to OpenAPI Schema Objects
* https://blog.readme.io/an-example-filled-guide-to-swagger-3-2/[A Visual Guide to What's New in OAI 3.0]; A good starting point
* https://editor.swagger.io/[Swagger Editor]
* https://app.swaggerhub.com/home[SWAGGERhub]: A good place to work collaboratively on schema; take the rendered server-side javacript and remove the Swagger branding
* Community-maintained https://github.com/OpenAPITools/openapi-generator/releases/tag/v3.0.0[Codegen packages] for OAI 3 API specifications; On Twitter as https://twitter.com/oas_generator[]
* link:schema/card.schema.json[]
* link:schema/card.schema.yml[]
* link:schema/gaborMinimalPersonSchema.yml[] +
109 changes: 109 additions & 0 deletions schema/bannerSoMattributes.adoc
@@ -0,0 +1,109 @@
=== bannerSoMattributes.adoc

- - -
_2020-04-08 10:10 attribute list

FROM bannerSchema.adoc

body

addRequest

executionMode: ?
requestID: ?
returnData: ?
targetID: ?

psoID
ID: ALPHA
targetID: ?
containerID/

containerID
ID: ?
targetID: ?
containerID/

data:

UDCIdentity
UDCIdentifier: E286607965E09B09BC1183030991013099

PersonIdentity
PUBLISHER_NAME: Banner
action: UPDATE

PersonName
FormattedName: given family
GivenName
FamilyName
Affix type:formOfAddress: Mr.
Affix type:qualification: Sr.

Gender: Mmmm

Birthdate
BirthDay: 1
BirthMonth: 1
BirthYear: 1997

PersonIdentity/

InstitutionalRoles

institutionalrole
role: UGRAD
context: INTCOMP
institutionalrole/

institutionalrole
role: INTACCEPT
context: INTCOMP
institutionalrole/

Institutional Roles/

Extension

Attribute
name: CWID
value: 1075463499

Attribute
name: PIDM
value: 44396499

Attribute
name: PIDM
value: 44396499

Attribute
name: APDC_CODE||'|'||APDC_DATE||'|'||TERM_CODE_ENTRY||'|'||LEVL_CODE||'|'||APPL_NO
value: CC|2015-07-28 14:32:49|202080|UG|1

Attribute
name: GOBTPAC_USER
value: GLEE

Attribute
name: GOBTPAC_USER
value: GLEE

Extension/

UDCIdentity/

data/

capabilityData
capabilityURI: ?
mustUnderstand: ?

addRequest/

body/



- - -
_2020-04-08 10:10 references and links_
94 changes: 94 additions & 0 deletions schema/bannerSoMattributes.json
@@ -0,0 +1,94 @@
{
"addRequest": {
"executionMode": "x",
"requestID": "x",
"returnData": "x",
"targetID": "x",
"psoID": {
"ID": "ALPHA",
"targetID": "x",
"psoContainerID": null
},
"containerID": {
"ID": "x",
"targetID": "x"
},
"data": {
"UDCIdentity": {
"UDCIdentifier": "E286607965E09B09BC1183030991013099"
},
"PersonIdentity": {
"PUBLISHER_NAME": "Banner",
"action": "UPDATE",
"PersonName": {
"FormattedName": "given family",
"GivenName": "x",
"FamilyName": "x",
"Affix typeFormOfAddress": "Mr.",
"Affix typeQualification": "Sr."
},
"Gender": "M",
"Birthdate": {
"BirthDay": 1,
"BirthMonth": 1,
"BirthYear": 1997
}
},
"InstitutionalRoles": [
{
"institutionalrole": {
"role": "UGRAD",
"context": "INTCOMP"
}
},
{
"institutionalrole": null,
"role": "INTACCEPT",
"context": "INTCOMP"
}
],
"Extension": [
{
"Attribute": {
"name": "CWID",
"value": 1075463499
}
},
{
"Attribute": {
"name": "PIDM",
"value": 44396499
}
},
{
"Attribute": {
"name": "PIDM",
"value": 44396499
}
},
{
"Attribute": {
"name": "APDC_CODE||'|'||APDC_DATE||'|'||TERM_CODE_ENTRY||'|'||LEVL_CODE||'|'||APPL_NO",
"value": "CC|2015-07-28 14:32:49|202080|UG|1"
}
},
{
"Attribute": {
"name": "GOBTPAC_USER",
"value": "GLEE"
}
},
{
"Attribute": {
"name": "GOBTPAC_USER",
"value": "GLEE"
}
}
]
},
"capabilityData": {
"capabilityURI": "x",
"mustUnderstand": "x"
}
}
}
76 changes: 76 additions & 0 deletions schema/bannerSoMattributes.yaml
@@ -0,0 +1,76 @@
addRequest:
executionMode: x
requestID: x
returnData: x
targetID: x

psoID:
ID: ALPHA
targetID: x
psoContainerID: NULL

containerID:
ID: x
targetID: x

data:

UDCIdentity:
UDCIdentifier: E286607965E09B09BC1183030991013099

PersonIdentity:
PUBLISHER_NAME: Banner
action: UPDATE

PersonName:
FormattedName: given family
GivenName: x
FamilyName: x
Affix typeFormOfAddress: Mr.
Affix typeQualification: Sr.

Gender: M

Birthdate:
BirthDay: 1
BirthMonth: 1
BirthYear: 1997

InstitutionalRoles:

- institutionalrole:
role: UGRAD
context: INTCOMP
- institutionalrole:
role: INTACCEPT
context: INTCOMP

Extension:

- Attribute:
name: CWID
value: 1075463499

- Attribute:
name: PIDM
value: 44396499

- Attribute:
name: PIDM
value: 44396499

- Attribute:
name: APDC_CODE||'|'||APDC_DATE||'|'||TERM_CODE_ENTRY||'|'||LEVL_CODE||'|'||APPL_NO
value: CC|2015-07-28 14:32:49|202080|UG|1

- Attribute:
name: GOBTPAC_USER
value: GLEE

- Attribute:
name: GOBTPAC_USER
value: GLEE

capabilityData:
capabilityURI: x
mustUnderstand: x
768 changes: 768 additions & 0 deletions schema/bannerSoMjsonSchema.json

Large diffs are not rendered by default.

159 changes: 159 additions & 0 deletions schema/bannerSoMschema.adoc
@@ -0,0 +1,159 @@
=== bannerSoMschema.adoc

From Matt Brookover on slack, March 31

This is Banner SPML for an accepted student

```
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:oasis:names:tc:SPML:2:0" xmlns:urn1="urn:sungardhe:enterprise:domain:identity:1.0">
<soapenv:Header/>

<soapenv:Body>

<urn:addRequest executionMode="?" requestID="?" returnData="?" targetID="?">
<urn:psoID ID="ALPHA" targetID="?">
<urn:containerID/>
</urn:psoID>
<urn:containerID ID="?" targetID="?">
<urn:containerID/>
</urn:containerID>

<urn:data>

<UDCIdentity PUBLISHER_NAME="Banner" action="UPDATE" xmlns="urn:sungardhe:enterprise:domain:identity:1.0">
<UDCIdentifier>E286607965E09B09BC1183030991013099</UDCIdentifier>

<PersonIdentity>
<PersonName>
<FormattedName>Alpha Trainee</FormattedName>
<GivenName>Alpha</GivenName>
<FamilyName>Trainee</FamilyName>
<Affix type="formOfAddress">Mr.</Affix>
<Affix type="qualification">Sr.</Affix>
</PersonName>

<Gender>M</Gender>
<Birthdate>
<BirthDay>1</BirthDay>
<BirthMonth>1</BirthMonth>
<BirthYear>1997</BirthYear>
</Birthdate>
</PersonIdentity>
<InstitutionRoles>
<institutionrole>
<role>UGRAD</role>
<context>INTCOMP</context>
</institutionrole>
<institutionrole>
<role>INTACCEPT</role>
<context>INTCOMP</context>
</institutionrole>
</InstitutionRoles>

<Extension>

<Attribute>
<name>CWID</name>
<value>1075463499</value>
</Attribute>
<Attribute>
<name>PIDM</name>
<value>44396499</value>
</Attribute>
<Attribute>
<name>APDC_CODE||'|'||APDC_DATE||'|'||TERM_CODE_ENTRY||'|'||LEVL_CODE||'|'||APPL_NO</name>
<value>CC|2015-07-28 14:32:49|202080|UG|1</value>
</Attribute> <Attribute>
<name>GOBTPAC_USER</name>
<value>GLEE</value>
</Attribute>
</Extension>

</UDCIdentity>

</urn:data>

<urn:capabilityData capabilityURI="?" mustUnderstand="?"/>
</urn:addRequest>
</soapenv:Body>

</soapenv:Envelope>
```

This is a student that was accepted, signaled their intent to enroll and registered an account:

```
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:oasis:names:tc:SPML:2:0" xmlns:urn1="urn:sungardhe:enterprise:domain:identity:1.0">
<soapenv:Header/>

<soapenv:Body>
<urn:addRequest executionMode="?" requestID="?" returnData="?" targetID="?">
<urn:psoID ID="ALPHA" targetID="?">
<urn:containerID/>
</urn:psoID>
<urn:containerID ID="?" targetID="?">
<urn:containerID/>
</urn:containerID>
<urn:data>
<UDCIdentity PUBLISHER_NAME="Banner" action="UPDATE" xmlns="urn:sungardhe:enterprise:domain:identity:1.0">
<UDCIdentifier>E286607965E09B09BC1183030991013099</UDCIdentifier>
<PersonIdentity>
<PersonName>
<FormattedName>Alpha Trainee</FormattedName>
<GivenName>Alpha</GivenName>
<FamilyName>Trainee</FamilyName>
<Affix type="formOfAddress">Mr.</Affix>
<Affix type="qualification">Sr.</Affix>
</PersonName>
<Gender>M</Gender>
<Birthdate>
<BirthDay>1</BirthDay>
<BirthMonth>1</BirthMonth>
<BirthYear>1997</BirthYear>
</Birthdate>
</PersonIdentity>
<InstitutionRoles>
<institutionrole>
<role>UGRAD</role>
<context>INTCOMP</context>
</institutionrole>
<institutionrole>
<role>STUDENT</role>
<context>INTCOMP</context>
</institutionrole>
</InstitutionRoles>
<Extension>
<Attribute>
<name>CWID</name>
<value>1075463499</value>
</Attribute>
<Attribute>
<name>PIDM</name>
<value>44396499</value>
</Attribute>
<Attribute>
<name>APDC_CODE||'|'||APDC_DATE||'|'||TERM_CODE_ENTRY||'|'||LEVL_CODE||'|'||APPL_NO</name>
<value>IE|2015-07-28 14:33:39|202080|UG|1</value>
</Attribute>
<Attribute>
<name>APDC_CODE||'|'||APDC_DATE||'|'||TERM_CODE_ENTRY||'|'||LEVL_CODE||'|'||APPL_NO</name>
<value>CC|2015-07-28 14:32:49|202080|UG|1</value>
</Attribute>
<Attribute>
<name>EXT_ID</name>
<value>alphatrainee</value>
</Attribute>
<Attribute>
<name>GOBTPAC_USER</name>
<value>GLEE</value>
</Attribute>
</Extension>
</UDCIdentity>
</urn:data>
<urn:capabilityData capabilityURI="?" mustUnderstand="?"/>
</urn:addRequest>

</soapenv:Body>

</soapenv:Envelope>
```
99 changes: 99 additions & 0 deletions schema/card.schema.json
@@ -0,0 +1,99 @@
{
"$id": "https://example.com/address.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "A representation of a person, company, organization, or place",
"type": "object",
"required": [ "familyName", "givenName" ],
"properties": {
"fn": {
"description": "Formatted Name",
"type": "string"
},
"familyName": {
"type": "string"
},
"givenName": {
"type": "string"
},
"additionalName": {
"type": "array",
"items": {
"type": "string"
}
},
"honorificPrefix": {
"type": "array",
"items": {
"type": "string"
}
},
"honorificSuffix": {
"type": "array",
"items": {
"type": "string"
}
},
"nickname": {
"type": "string"
},
"url": {
"type": "string"
},
"email": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"value": {
"type": "string"
}
}
},
"tel": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"value": {
"type": "string"
}
}
},
"adr": { "$ref": "http://example.com/address.schema.json" },
"geo": { "$ref": "http://example.com/geographical-location.schema.json" },
"tz": {
"type": "string"
},
"photo": {
"type": "string"
},
"logo": {
"type": "string"
},
"sound": {
"type": "string"
},
"bday": {
"type": "string"
},
"title": {
"type": "string"
},
"role": {
"type": "string"
},
"org": {
"type": "object",
"properties": {
"organizationName": {
"type": "string"
},
"organizationUnit": {
"type": "string"
}
}
}
}
}
71 changes: 71 additions & 0 deletions schema/card.schema.yml
@@ -0,0 +1,71 @@
---
"$id": https://example.com/address.schema.json
"$schema": http://json-schema.org/draft-07/schema#
description: A representation of a person, company, organization, or place
type: object
required:
- familyName
- givenName
properties:
fn:
description: Formatted Name
type: string
familyName:
type: string
givenName:
type: string
additionalName:
type: array
items:
type: string
honorificPrefix:
type: array
items:
type: string
honorificSuffix:
type: array
items:
type: string
nickname:
type: string
url:
type: string
email:
type: object
properties:
type:
type: string
value:
type: string
tel:
type: object
properties:
type:
type: string
value:
type: string
adr:
"$ref": http://example.com/address.schema.json
geo:
"$ref": http://example.com/geographical-location.schema.json
tz:
type: string
photo:
type: string
logo:
type: string
sound:
type: string
bday:
type: string
title:
type: string
role:
type: string
org:
type: object
properties:
organizationName:
type: string
organizationUnit:
type: string
1 change: 1 addition & 0 deletions schema/foo.json
@@ -0,0 +1 @@
foo.json placeholder for JSON Schema specs for T&I resources
111 changes: 111 additions & 0 deletions schema/gaborMinimalPersonSchema.yml
@@ -0,0 +1,111 @@
---
"$schema": http://json-schema.org/draft-07/schema#
definitions: {}
id: "http://id.internet2.edu/schemas/minPerson/v1"
properties:
beginTimestamp:
id: "/properties/beginTimestamp"
type: string
emails:
id: "/properties/emails"
items:
id: "/properties/emails/items"
properties:
value:
id: "/properties/emails/items/properties/value"
type: string
type:
id: "/properties/emails/items/properties/type"
type: string
type: object
type: array
phoneNumbers:
id: "/properties/phoneNumbers"
items:
id: "/properties/phoneNumbers/items"
properties:
value:
id: "/properties/phoneNumbers/items/properties/value"
type: string
primary:
id: "/properties/phoneNumbers/items/properties/primary"
type: boolean
type:
id: "/properties/phoneNumbers/items/properties/type"
type: string
type: object
type: array
dateCreated:
id: "/properties/dateCreated"
type: string
dateInactivated:
id: "/properties/dateInactivated"
type: string
endTimestamp:
id: "/properties/endTimestamp"
type: string
entityObjectId:
id: "/properties/entityObjectId"
type: string
entityType:
id: "/properties/entityType"
type: string
friendlyName:
description: A common name the entity, suitable for display purposes.
id: "/properties/friendlyName"
type: string
identifiers:
id: "/properties/identifiers"
items:
id: "/properties/identifiers/items"
properties:
userName:
description: A handle by which the person is known in
contexts of gaining access to services.
id: "/properties/identifiers/items/properties/userName"
type: string
type: object
type: array
names:
id: "/properties/names"
items:
id: "/properties/names/items"
properties:
givenName:
id: "/properties/names/items/properties/givenName"
type: string
formatted:
id: "/properties/names/items/properties/formatted"
type: string
familyName:
id: "/properties/names/items/properties/familyName"
type: string
middleName:
id: "/properties/names/items/properties/middleName"
type: string
honorificPrefix:
id: "/properties/names/items/properties/honorificPrefix"
type: string
honorificSuffix:
id: "/properties/names/items/properties/honorificSuffix"
type: string
type:
id: "/properties/names/items/properties/type"
type: string
type: object
type: array
protect:
id: "/properties/protect"
type: boolean
status:
description: This is used to track the lifecycle of an entity
through a series of states.
id: "/properties/status"
title: Status of entry
type: string
updatingEntityId:
id: "/properties/updatingEntityId"
type: string
updatingSOR:
id: "/properties/updatingSOR"
type: string
83 changes: 83 additions & 0 deletions schema/minimalRegistryPerson.json
@@ -0,0 +1,83 @@
{"title": "Minimal Registry Person Schema from Internet2 T&I",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Minimal Registry Person Schema from Internet2 T&I",
"type": "object",

"properties": {

"name": {
"type": "object",
"properties": {
"familyName": {"type": "string"},
"givenName": {"type": "string"},
"middleName": {"type": "string"},
"nameType": {"type": "string"}
}
},

"logonId": {
"type": "string",
"description": "same as identifier/network in Core Attribute Specification. Mapped to target system ID, (__NAME__, in ConnID)"
},

"iamId": {
"type": "string",
"description": "same as identifier/enterprise in Core Attribute Specification; created on inbound mapping(?)"
},

"priorId": {
"type": "array",
"items": {
"type": "string"
}
},

"sorId": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {"type": "string"},
"id": {"type": "string"}
}
}
},

"subjId": {
"type": "string",
"description": "Preferred personal pronoun"
},

"dateOfBirth": {
"type": "string",
"description": "Date of birth, string representtion of dateOfBirth in Core Attribute Specification"
},

"email": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emailAddress": {"type": "string"},
"emailType": {"type": "string"} }
}
},

"phone": {
"type": "array",
"description": "same as telephoneNumber in Core Attribute Specification",
"items": {
"type": "object",
"properties": {
"phoneNumber": {"type": "string"},
"phoneType": {"type": "string"}
}
}
},

"personalPronoun": {
"type": "string",
"description": "Preferred personal pronoun"}

}
}
5 changes: 5 additions & 0 deletions schema/tools.adoc
@@ -0,0 +1,5 @@
Schema Tools
============

- https://www.npmjs.com/package/ajv-cli[ajv-cli]: npm-installable CLI tool to validate JSON Schema specifications
- https://www.jsonschemavalidator.net[Online JSON Schema validator]

0 comments on commit 885e634

Please sign in to comment.