Changes for page 2. Authenticating with your OIDC client and fetch collab user info
Last modified by messines on 2021/06/08 17:32
Summary
-
Page properties (2 modified, 0 added, 0 removed)
Details
- Page properties
-
- Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki.m essines1 +XWiki.mmorgan - Content
-
... ... @@ -1,15 +1,15 @@ 1 1 == Abstract == 2 2 3 - Youhadbeencreatingan OIDC clientfollowingourguide[[https:~~/~~/wiki.ebrains.eu/bin/view/Collabs/collaboratory-community-apps/Community%20App%20Developer%20Guide/Registering%20an%20OIDC%20client/>>https://wiki.ebrains.eu/bin/view/Collabs/collaboratory-community-apps/Community%20App%20Developer%20Guide/Registering%20an%20OIDC%20client/]]3 +In order to create an OIDC client, see [[1. Registering an OIDC client>>https://wiki.ebrains.eu/bin/view/Collabs/collaboratory-community-apps/Community%20App%20Developer%20Guide/1.%20Registering%20an%20OIDC%20client/]]. After creating the OIDC client, you have a corresponding access token and secret. 4 4 5 - Theredirect_uriis setwiththeurlofyourapplication,inthisexemplewewilluse,aplatformforapi developement,useyour ownapplication,forexemplewhenyoulogginto thiswiki,theredirecturiis [[https:~~/~~/wiki.ebrains.eu/*>>https://wiki.ebrains.eu/*]]5 +For the example below, we consider the case of someone wanting to provide access to https:~/~/www.getpostman.com as an app for Collaboratory users to access from their collabs. You should replace that URL by the one of your own app. 6 6 7 -The client isconfidentialwitha secret,youobtainitthroughtthe registeringoidc clienttutorialabove.7 +The redirect_uri is set with the URL of your application to which your users will be redirected after having been authenticated by their EBRAINS account. For example when you login to this wiki, the redirect URI is [[https:~~/~~/wiki.ebrains.eu/*>>https://wiki.ebrains.eu/*]] 8 8 9 9 [[image:Screenshot 2020-07-15 at 17.47.12.png||height="517" width="758"]] 10 10 11 11 12 -The whole authentication flow presented here is based on the official OAuth2 rfcdescribe in the section 4.112 +The whole authentication flow presented here is based on the official OAuth2 RFC described in the section 4.1. 13 13 14 14 [[https:~~/~~/tools.ietf.org/html/rfc6749#section-4.1>>https://tools.ietf.org/html/rfc6749#section-4.1]] 15 15 ... ... @@ -17,65 +17,67 @@ 17 17 18 18 == Authentication flow == 19 19 20 -=== Authorization Code Grant ===20 +=== Authorization Code Request === 21 21 22 -The first step of the authentication protocol is to fetch an **authorization code **for your client and your user 22 +The first step of the authentication protocol is to fetch an **authorization code **for your client and your user. This is done by directing your users to the URL of the EBRAINS login page (**IAM**) where they can enter their username and password. 23 23 24 24 ==== Request ==== 25 25 26 - /GETon [[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth>>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth]]26 +The authorization **code **is fetched by an HTTP request: 27 27 28 - withqueryparameters28 +/GET: [[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth>>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth]] 29 29 30 +with the following parameters: 31 + 30 30 * response_type=code 31 -* client_id=community-apps-tutorial 32 -* redirect_uri=[[https:~~/~~/www.getpostman.com/oauth2/callback>>https://www.getpostman.com/oauth2/callback]] 33 33 * login=true 34 -* scope=openid+group+team 34 +* client_id=**//community-apps-tutorial//** 35 +* redirect_uri=**//https:~/~/www.getpostman.com/oauth2/callback//** 36 +* scope=openid**//+group+team//** 35 35 36 -so 38 +with the italics indicating the fields you customize for your own app. The URL will look like: 37 37 38 - [[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth?response_type=code&client_id=community-apps-tutorial&redirect_uri=https:~~/~~/www.getpostman.com/oauth2/callback&login=true&scope=openid+group+team>>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth?response_type=code&client_id=community-apps-tutorial&redirect_uri=https://www.getpostman.com/oauth2/callback&login=true&scope=openid+group+team]]40 +https:~/~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth?response_type=code&login=true&client_id=//**community-apps-tutorial**//&redirect_uri=//**https:~/~/www.getpostman.com/oauth2/callback**//&scope=openid//**+group+team**// 39 39 40 - Ofcourse replace**client_id** and**redirect_uri**with yourownconfiguration42 +The **scope** parameter can include a combination of several values. Each user will be asked to consent to sharing that scope with your app upon first access. 41 41 42 -This will redirect you to the login page of **iam **where your user must enter they username/password 44 +* **openid: **This scope is required because we use the OIDC protocol. It will give your app access to the user's basic information such as username, email and full name. 45 +* **group **(optional)**: **If you request this scope, the future access token generated will authorize your app to identify which units and groups the user belongs to. 46 +* **team **(optional)**: **This scope is like the group scope lets your app identify the permissions of the user, but by identifying what collabs the user has access to and with what roles. 43 43 44 -==== Scope ==== 48 +{{info}} 49 +The group and team scopes are a simple way for your app to grant permissions to its services and resources when you want to grant access to a very few units, groups, or collab teams. For more complex permission management, contact support. 50 +{{/info}} 45 45 46 -In the request you can see a **scope** **parameter** 47 - 48 -* **openid : **This scope is required in oidc, it contains basic information of the user such as it username, email and full name. 49 -* **group **( optional ) **: **This scope is provided by our service, if you add it to your authorization code grant request, the futur access token generated will be able to read which units and groups the logged user belongs, it can be very important for your application. You can notice on the screenshot in the abstract section that **Consent required **is **on, **it means that at loggin time, the user will be asked if he allow your application to access there unit and group membership 50 -* **team **( optional ) **: **Very same than group, but for collab, with this scope your application will know in which collab the authenticated user belong 51 - 52 52 ==== Response ==== 53 53 54 - Afterthe loggin, you got a 301 redirection and200 successhttpresponse with a **code** inside54 +Once the user has logged in, your app gets an HTTP 301 redirection followed by an HTTP 200 success response with an authorization **code** inside. A typical response might look like: 55 55 56 - [[https:~~/~~/www.getpostman.com/oauth2/callback?session_state=a0ff8a68-2654-43ef-977a-6c15ce343546&code=f3f04f93-hbp-482d-ac3d-demo.turtorial.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7>>https://www.getpostman.com/oauth2/callback?session_state=a0ff8a68-2654-43ef-977a-6c15ce598886&code=f3f04f93-b98d-482d-ac3d-414cead54de0.a0ff8a68-2654-43ef-977a-6c15ce598886.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7]]56 +https:~/~/www.getpostman.com/oauth2/callback?session_state=a0ff8a68-2654-43ef-977a-6c15ce343546&code=**f3f04f93-hbp-482d-ac3d-demo.turtorial.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7** 57 57 58 58 (% class="box infomessage" %) 59 59 ((( 60 - the code isveryimportantforthenextstepherethe codeis //f3f04f93-hbp-482d-ac3d-demo.turtorial.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7//60 +The authorization **code** is the part in bold in the response above. 61 61 ))) 62 62 63 - 64 64 === Access Token Request === 65 65 65 +(% class="wikigeneratedid" id="HRequest-1" %) 66 +Now that your app has the **authorization** **code** for a user, it can fetch the user access token 67 + 66 66 ==== Request ==== 67 67 68 - Nowthatyou havethe**authorization** **code, **youcanreachthe **/token**endpointand fetchtheuseraccesstoken70 +/POST: [[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/token>>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/token]] 69 69 70 - /POST :https:/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/token72 +with the following parameters: 71 71 72 -with params 74 +* grant_type: authorization_code 75 +* code: **//f3f04f93-hbp-482d-ac3d-demo.turtorial.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7//** 76 +* redirect_uri: **//[[https:~~/~~/www.getpostman.com/oauth2/callback>>https://www.getpostman.com/oauth2/callback]]//** 77 +* client_id: **//community-apps-tutorial//** 78 +* client_secret: **//your client secret obtained during client creation//** 73 73 74 -* grant_type : authorization_code 75 -* code : //f3f04f93-hbp-482d-ac3d-demo.turtorial.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7// 76 -* redirect_uri : [[https:~~/~~/www.getpostman.com/oauth2/callback>>https://www.getpostman.com/oauth2/callback]] 77 -* client_id : community-apps-tutorial 78 -* client_secret : your client secret obtained during client creation 80 +The image below shows a sample POST request generated from the Postman tool. [The fact that this page is based on getpostman.com as an example is pure coincidence.] 79 79 80 80 [[image:Screenshot 2020-07-15 at 18.20.34.png]] 81 81 ... ... @@ -99,35 +99,33 @@ 99 99 } 100 100 ))) 101 101 102 -You get a response containing the access token and other s104 +Your app gets a response containing the **access token** and other information. 103 103 104 104 == Access user info == 105 105 108 +Now that your app has the access token of a user, it can fetch the user's info. 109 + 106 106 ==== Request ==== 107 107 108 - Nowthatyour applicationgottheccesstokenf your user,it'sllyeasytofetchuser112 +/GET: [[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/userinfo>>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/userinfo]] 109 109 110 -(% class="box infomessage" %) 111 -((( 112 -/GET https:/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/userinfo 113 -))) 114 +with the following parameters: 114 114 115 - andjustprovidethe access tokenas**Authorization**header116 +* Authorization: the access token preceded by the string "Bearer " 116 116 118 +The image below shows a sample GET request generated from the Postman tool. [The fact that this page is based on getpostman.com as an example is pure coincidence.] 119 + 117 117 [[image:Screenshot 2020-07-15 at 18.28.28.png||height="161" width="566"]] 118 118 119 - 120 120 ==== Response ==== 121 121 122 -As response you will have ajsonwith all the information onthe logged user, for my user124 +As response your app receives a JSON with all the information about the logged user 123 123 124 124 (% class="box" %) 125 125 ((( 126 126 { 127 - "sub": "fa2db206-3 eb4-403c-894a-810ebaba98e1",129 + "sub": "fa2db206-3...0ebaba98e1", 128 128 "unit": [ 129 - "/collab-devs", 130 - "/collab-team", 131 131 "/all/institutions/switzerland/epfl", 132 132 "/all/projects/hbp/consortium/SGA2/SP05", 133 133 "/all/projects/hbp/consortium/SGA3/WP6/T6_11" ... ... @@ -140,13 +140,21 @@ 140 140 "feature:authenticate" 141 141 ], 142 142 "team": [ 143 - "collab-collaboratory-community-apps-editor" 143 + "**collab**-collaboratory-community-apps-**editor**" 144 144 ], 145 145 "group": [ 146 - "group-collaboratory-developers", 147 - "unit-all-projects-hbp-consortium-sga2-sp05-administrator" 146 + "**group**-collaboratory-developers", 147 + "**unit**-all-projects-hbp-consortium-sga2-sp05-**administrator**" 148 148 ] 149 149 }, 150 - "mitreid-sub": "30 5862"150 + "mitreid-sub": "30...62" 151 151 } 152 152 ))) 153 + 154 +The unit field above lists Collaboratory Units which the user is a member of, with the unit name using slashes instead of the colons you see in the Collaboratory UI. 155 + 156 +jupyterhub and xwiki are OIDC clients with more advanced permission management. 157 + 158 +The team field above lists Collaboratory Teams which the user is a member of, in the form "collab-//collabname//-//role//" where //role //is one of admin, editor, or viewer according to the user's role in collab //collabname//. 159 + 160 +The group field above lists Collaboratory Groups which the user is a member of, in the form "group-//groupname//". It also lists Collaboratory Units which the user is an admin of, in the form "unit-//unitname//-administrator" with //unitname //using dashes instead of the colons you see in the Collaboratory UI.