This is a Resource Server to be used for educational purpose only, e.g. it contains hardcoded user accounts etc.
Using docker
$ docker run -p 127.0.0.1:8080:8080 --env SECURITY_JWT_SIGNINGKEY=MRzRBGrU2xtK29dcSLRLUmbwXDVxHmPT cygni/oauth2-resource-server
Using docker-compose
version: '3.7'
services:
resource-server:
image: cygni/oauth2-resource-server
container_name: resource-server
environment:
- SECURITY_JWT_SIGNINGKEY=MRzRBGrU2xtK29dcSLRLUmbwXDVxHmPT
ports:
- '8080:8080'
The backend exposes the following REST endpoints. At the very bottom of this README you will also find examples of request/response messages for each.
| Endpoint | Request method(s) | Authorized role(s) |
|---|---|---|
| /api | GET | ADMIN, USER |
| /api/events | GET | ADMIN |
| /api/users | GET | ADMIN |
| /api/users/{userId} | GET | ADMIN, USER |
| /api/users/{userId}/subscriptions | GET | ADMIN, USER |
| /api/users/{userId}/files | GET | ADMIN, USER |
| /api/hashtags | GET | ADMIN, USER |
| /api/hashtags/{hashtag} | GET | ADMIN, USER |
| /api/hashtags/{hashtag}/subscribe | POST | ADMIN, USER |
| /api/hashtags/{hashtag}/unsubscribe | POST | ADMIN, USER |
| /api/hashtags/{hashtag}/files | GET | ADMIN, USER |
| /api/files | GET, POST | ADMIN, USER |
| /api/files/{fileId} | GET | ADMIN, USER |
| /api/files/{fileId}/hashtags | GET | ADMIN, USER |
| /api/files/{fileId}/download | GET | ADMIN, USER |
$ curl --request GET -i --insecure http://resource.local/api -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2hubnkucHVtYUBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJQdW1hIiwiZXhwIjoxNTgwNjU2MDg5LCJmaXJzdF9uYW1lIjoiSm9obm55IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjI3OTQ5ZmNlLWE1M2MtNGZjMS1hN2FiLTM5MzczMGMxOTNkMCIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.U8GHeInjtlkXYzy9vF0NacN4ROA1jHDvn3XBATW3hng"
HTTP/1.1 200
{
"_links" : {
"self" : {
"href" : "http://resource.local/api"
},
"userProfile" : {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44"
},
"hashtags" : {
"href" : "http://resource.local/api/hashtags"
},
"files" : {
"href" : "http://resource.local/api/files"
},
"users" : {
"href" : "http://resource.local/api/users"
},
"events" : {
"href" : "http://resource.local/api/events"
}
}
}
Possible events to expect:
$ curl --request GET -i --insecure http://resource.local/api/events -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2hubnkucHVtYUBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJQdW1hIiwiZXhwIjoxNTgwNjU2MDg5LCJmaXJzdF9uYW1lIjoiSm9obm55IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjI3OTQ5ZmNlLWE1M2MtNGZjMS1hN2FiLTM5MzczMGMxOTNkMCIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.U8GHeInjtlkXYzy9vF0NacN4ROA1jHDvn3XBATW3hng"
HTTP/1.1 200
{
"events" : [ {
"occurred" : "2020-02-02T22:03:45.006749Z",
"uploadedBy" : {
"username" : "[email protected]"
},
"file" : {
"hashtags" : [ {
"hashtag" : "thebestever"
} ],
"filename" : "somefancyfile.png",
"size" : 3743,
"uploadedTime" : "2020-02-02T22:03:45.006Z",
"uploadedBy" : {
"username" : "[email protected]"
}
},
"type" : "UPLOAD_FILE_EVENT"
}, {
"occurred" : "2020-02-02T22:03:45.000850Z",
"createdBy" : {
"username" : "[email protected]"
},
"hashtag" : {
"hashtag" : "thebestever"
},
"type" : "CREATE_HASHTAG_EVENT"
} ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/events"
}
}
}
$ curl --request GET -i --insecure http://resource.local/api/users -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJIZXJvIiwiZXhwIjoxNTgwNjgwNzMyLCJmaXJzdF9uYW1lIjoiU3VwZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjAzY2I1YWJhLTA4MGUtNDFhOS05NjVhLTdmMjIyMzI4MWFkNiIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.4Epq4_yV1Y7P5kOio8LpQPiwda1HY9ovfQrGBHEBLec"
HTTP/1.1 200
{
"users" : [ {
"username" : "[email protected]",
"subscriptions" : [ ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/users/37507ffde1b148b9b5fc5d19c0535b0a"
}
}
}, {
"username" : "[email protected]",
"subscriptions" : [ ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44"
}
}
}, {
"username" : "[email protected]",
"subscriptions" : [ ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/users/e332e65bbab443d189671e8cceee7c28"
}
}
} ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/users"
}
}
}
$ curl --request GET -i --insecure http://resource.local/api/users/4441df695b0c4bceab57cfc17d85f927 -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2hubnkucHVtYUBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJQdW1hIiwiZXhwIjoxNTgwNjU2MDg5LCJmaXJzdF9uYW1lIjoiSm9obm55IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjI3OTQ5ZmNlLWE1M2MtNGZjMS1hN2FiLTM5MzczMGMxOTNkMCIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.U8GHeInjtlkXYzy9vF0NacN4ROA1jHDvn3XBATW3hng"
HTTP/1.1 200
{
"username" : "[email protected]",
"firstName" : "Johnny",
"lastName" : "Puma",
"subscriptions" : [ ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/users/4441df695b0c4bceab57cfc17d85f927"
},
"subscriptions" : {
"href" : "http://resource.local/api/users/4441df695b0c4bceab57cfc17d85f927/subscriptions"
}
}
}
$ curl --request GET -i --insecure http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44/subscriptions -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJIZXJvIiwiZXhwIjoxNTgwNjgwNzMyLCJmaXJzdF9uYW1lIjoiU3VwZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjAzY2I1YWJhLTA4MGUtNDFhOS05NjVhLTdmMjIyMzI4MWFkNiIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.4Epq4_yV1Y7P5kOio8LpQPiwda1HY9ovfQrGBHEBLec"
HTTP/1.1 200
{
"subscriptions" : [ ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44/subscriptions"
},
"user" : {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44"
},
"users" : {
"href" : "http://resource.local/api/users"
}
}
}
Get all available files matching the current user subscriptions.
$ curl --request GET -i --insecure http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44/files -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJIZXJvIiwiZXhwIjoxNTgwNjgwNzMyLCJmaXJzdF9uYW1lIjoiU3VwZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjAzY2I1YWJhLTA4MGUtNDFhOS05NjVhLTdmMjIyMzI4MWFkNiIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.4Epq4_yV1Y7P5kOio8LpQPiwda1HY9ovfQrGBHEBLec"
HTTP/1.1 200
{
"files" : [ ],
"_links" : {
"self" : [ {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44/files"
}, {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44/subscriptions"
} ],
"user" : {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44"
},
"users" : {
"href" : "http://resource.local/api/users"
}
}
}
$ curl --request GET -i --insecure http://resource.local/api/hashtags -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2hubnkucHVtYUBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJQdW1hIiwiZXhwIjoxNTgwNjU2MDg5LCJmaXJzdF9uYW1lIjoiSm9obm55IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjI3OTQ5ZmNlLWE1M2MtNGZjMS1hN2FiLTM5MzczMGMxOTNkMCIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.U8GHeInjtlkXYzy9vF0NacN4ROA1jHDvn3XBATW3hng"
HTTP/1.1 200
{
"hashtags" : [ {
"hashtag" : "crosscountryskiing",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/crosscountryskiing"
}
}
}, {
"hashtag" : "fanzy",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/fanzy"
}
}
}, {
"hashtag" : "cool",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/cool"
}
}
}, {
"hashtag" : "bestimageever",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/bestimageever"
}
}
}, {
"hashtag" : "vasaloppet",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/vasaloppet"
}
}
} ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags"
}
}
}
$ curl --request GET -i --insecure http://resource.local/api/hashtags/crosscountryskiing -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2hubnkucHVtYUBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJQdW1hIiwiZXhwIjoxNTgwNjU2MDg5LCJmaXJzdF9uYW1lIjoiSm9obm55IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjI3OTQ5ZmNlLWE1M2MtNGZjMS1hN2FiLTM5MzczMGMxOTNkMCIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.U8GHeInjtlkXYzy9vF0NacN4ROA1jHDvn3XBATW3hng"
HTTP/1.1 200
{
"hashtag" : "crosscountryskiing",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/crosscountryskiing"
},
"files" : {
"href" : "http://resource.local/api/hashtags/crosscountryskiing/files"
}
}
}
$ curl --request POST -i --insecure http://resource.local/api/hashtags/crosscountryskiing/subscribe -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJIZXJvIiwiZXhwIjoxNTgwNjgwNzMyLCJmaXJzdF9uYW1lIjoiU3VwZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjAzY2I1YWJhLTA4MGUtNDFhOS05NjVhLTdmMjIyMzI4MWFkNiIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.4Epq4_yV1Y7P5kOio8LpQPiwda1HY9ovfQrGBHEBLec"
$ curl --request POST -i --insecure http://resource.local/api/hashtags/vasaloppet/subscribe -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJIZXJvIiwiZXhwIjoxNTgwNjgxMzA5LCJmaXJzdF9uYW1lIjoiU3VwZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjJhODA4MTlkLTMzNzAtNDc5Ny1iZWFiLTg2MDA4ZmI3MzUyYiIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.iKZ9CUq5l0jFdlHaJMIGZb1aDsNcpfoek1tGWKjY8G0"
HTTP/1.1 200
{
"username" : "[email protected]",
"firstName" : "Super",
"lastName" : "Hero",
"subscriptions" : [ {
"hashtag" : "crosscountryskiing",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/crosscountryskiing"
}
}
}, {
"hashtag" : "vasaloppet",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/vasaloppet"
}
}
} ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44"
}
}
}
$ curl --request POST -i --insecure http://resource.local/api/hashtags/vasaloppet/unsubscribe -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJIZXJvIiwiZXhwIjoxNTgwNjgxMzA5LCJmaXJzdF9uYW1lIjoiU3VwZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjJhODA4MTlkLTMzNzAtNDc5Ny1iZWFiLTg2MDA4ZmI3MzUyYiIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.iKZ9CUq5l0jFdlHaJMIGZb1aDsNcpfoek1tGWKjY8G0"
HTTP/1.1 200
{
"username" : "[email protected]",
"firstName" : "Super",
"lastName" : "Hero",
"subscriptions" : [ {
"hashtag" : "crosscountryskiing",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/crosscountryskiing"
}
}
} ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/users/f8f15c9310654c528707e87f5773ef44"
}
}
}
$ curl --request GET -i --insecure http://resource.local/api/hashtags/crosscountryskiing/files -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2hubnkucHVtYUBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJQdW1hIiwiZXhwIjoxNTgwNjU4MzM4LCJmaXJzdF9uYW1lIjoiSm9obm55IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6ImY4ZjE2NzIyLWU0NDMtNGE3Ny04ZTEzLTE3Yzc3YjM5MzI2MSIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.V7DfHLnx_UJnHCcl3xGdaeNrUrTuvXVVQ3obBGBCEbM"
HTTP/1.1 200
{
"files" : [ {
"filename" : "somefancyfile.png",
"hashtags" : [ "crosscountryskiing" ],
"size" : 3743,
"uploadedTime" : "2020-02-02T15:35:33.734922Z",
"uploadedBy" : "[email protected]",
"_links" : {
"self" : {
"href" : "http://resource.local/api/files/ced23473d4bf48519b94811141a3a22b"
}
}
} ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/crosscountryskiing/files"
},
"hashtag" : {
"href" : "http://resource.local/api/hashtags/crosscountryskiing"
}
}
}
$ curl --request GET -i --insecure http://resource.local/api/files -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJIZXJvIiwiZXhwIjoxNTgwNjgxMzA5LCJmaXJzdF9uYW1lIjoiU3VwZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjJhODA4MTlkLTMzNzAtNDc5Ny1iZWFiLTg2MDA4ZmI3MzUyYiIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.iKZ9CUq5l0jFdlHaJMIGZb1aDsNcpfoek1tGWKjY8G0"
HTTP/1.1 200
{
"files" : [ {
"filename" : "somefancyfile.png",
"hashtags" : [ "crosscountryskiing" ],
"size" : 3743,
"uploadedTime" : "2020-02-02T21:57:47.465951Z",
"uploadedBy" : "[email protected]",
"_links" : {
"self" : {
"href" : "http://resource.local/api/files/39025c08a3c14021a6cc8526f8e12809"
}
}
} ],
"_links" : {
"self" : {
"href" : "http://resource.local/api/files"
}
}
}
$ curl -F '[email protected]' -F 'hashtags=[{"hashtag":"crosscountryskiing"}]' http://resource.local/api/files -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJIZXJvIiwiZXhwIjoxNTgwNjgxMzA5LCJmaXJzdF9uYW1lIjoiU3VwZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjJhODA4MTlkLTMzNzAtNDc5Ny1iZWFiLTg2MDA4ZmI3MzUyYiIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.iKZ9CUq5l0jFdlHaJMIGZb1aDsNcpfoek1tGWKjY8G0"
HTTP/1.1 201
{
"filename" : "somefancyfile.png",
"hashtags" : [ "crosscountryskiing" ],
"size" : 3743,
"uploadedTime" : "2020-02-02T15:35:33.734922Z",
"uploadedBy" : "[email protected]",
"_links" : {
"self" : {
"href" : "http://resource.local/api/files/ced23473d4bf48519b94811141a3a22b"
},
"download" : {
"href" : "http://resource.local/api/files/ced23473d4bf48519b94811141a3a22b/download"
},
"hashtags" : {
"href" : "http://resource.local/api/files/ced23473d4bf48519b94811141a3a22b/hashtags"
},
"uploadedBy" : {
"href" : "http://resource.local/api/users/1196de116ae14436943f1acbe55beb20"
}
}
}
$ curl --request GET -i --insecure http://resource.local/api/files/ced23473d4bf48519b94811141a3a22b/hashtags -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2hubnkucHVtYUBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJQdW1hIiwiZXhwIjoxNTgwNjU4MzM4LCJmaXJzdF9uYW1lIjoiSm9obm55IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6ImY4ZjE2NzIyLWU0NDMtNGE3Ny04ZTEzLTE3Yzc3YjM5MzI2MSIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.V7DfHLnx_UJnHCcl3xGdaeNrUrTuvXVVQ3obBGBCEbM"
HTTP/1.1 200
{
"hashtags" : [ {
"hashtag" : "crosscountryskiing",
"_links" : {
"self" : {
"href" : "http://resource.local/api/hashtags/crosscountryskiing"
}
}
} ]
}
$ curl -i --insecure http://resource.local/api/files/e6ca1e14b9ab4c23a129fc768f991ba2/download -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2hubnkucHVtYUBjeWduaS5zZSIsInNjb3BlIjpbImFueSJdLCJsYXN0X25hbWUiOiJQdW1hIiwiZXhwIjoxNTgwNjU4MzM4LCJmaXJzdF9uYW1lIjoiSm9obm55IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6ImY4ZjE2NzIyLWU0NDMtNGE3Ny04ZTEzLTE3Yzc3YjM5MzI2MSIsImNsaWVudF9pZCI6Ik5RcWtDYnNlMnIifQ.V7DfHLnx_UJnHCcl3xGdaeNrUrTuvXVVQ3obBGBCEbM"
HTTP/1.1 200
Content-Disposition: attachment; filename="somefancyfile.png"
Content-Length: 3743
...
Content type
Image
Digest
Size
268.8 MB
Last updated
over 6 years ago
docker pull cygni/oauth2-resource-server