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 (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,15 +1,15 @@ 1 1 == Abstract == 2 2 3 - Inordertocreatean OIDC client,see [[1. RegisteringanOIDC client>>https://wiki.ebrains.eu/bin/view/Collabs/collaboratory-community-apps/Community%20App%20Developer%20Guide/1.%20Registering%20an%20OIDC%20client/]]. Aftercreating theOIDC client, you haveespondingaccesstoken andcret.3 +You had been creating an OIDC client following our guide [[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/]] 4 4 5 - For the examplebelow,weconsiderthecaseofsomeonewantingtoprovideaccesstohttps:~/~/www.getpostman.comasan appforCollaboratoryusersto accessfromtheircollabs.YoushouldreplacethatURLbytheoneof yourownapp.5 +The redirect_uri is set with the url of your application, in this exemple we will use postman, a platform for api developement, use your own application, for exemple when you loggin to this wiki, the redirect uri is [[https:~~/~~/wiki.ebrains.eu/*>>https://wiki.ebrains.eu/*]] 6 6 7 -The redirect_uriisset withthe URL of yourapplicationto whichyourusers willbe redirectedafter havingbeen authenticatedbytheirEBRAINS account.For example whenyou login to thiswiki,theedirectURIis[[https:~~/~~/wiki.ebrains.eu/*>>https://wiki.ebrains.eu/*]]7 +The client is confidential with a secret, you obtain it throught the registering oidc client tutorial above. 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 RFCdescribedin the section 4.1.12 +The whole authentication flow presented here is based on the official OAuth2 rfc describe 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,73 +17,63 @@ 17 17 18 18 == Authentication flow == 19 19 20 -=== Authorization Code Request ===20 +=== Authorization Code Grant === 21 21 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 - 24 24 ==== Request ==== 25 25 26 -The orization **code**is fetchedbyanHTTP request:24 +/GET on [[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth >>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth]] 27 27 28 - /GET: [[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth>>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/auth]]26 +with query parameters 29 29 30 -with the following parameters: 31 - 32 32 * response_type=code 29 +* client_id=community-apps-tutorial 30 +* redirect_uri=[[https:~~/~~/www.getpostman.com/oauth2/callback>>https://www.getpostman.com/oauth2/callback]] 33 33 * login=true 34 -* client_id=**//community-apps-tutorial//** 35 -* redirect_uri=**//https:~/~/www.getpostman.com/oauth2/callback//** 36 -* scope=openid**//+group+team//** 32 +* scope=openid+group+team 37 37 38 - with the italicsindicating the fields you customize for your own app. The URL will look like:34 +so 39 39 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**//36 +[[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]] 41 41 42 - The**scope**parameter can includeacombinationof severalvalues. Each userwill beaskedto consentto sharingthat scopewith yourapp upon firstaccess.38 +Of course replace **client_id** and **redirect_uri** with your own configuration 43 43 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 -* **profile** (optional): More information on user if provided by the user 46 -* **email **(optional): The verified email of the user, should be add in addition of openid and/or profile to get the email. 47 -* **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. 48 -* **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. 49 -* **clb.wiki.read **(optional): access to GET Collab API 50 -* **clb.wiki.write** (optional): access to DELETE/PUT/POST Collab API 51 -* **collab.drive **(optional): access to GET/POST/PUT/DELETE drive API 52 -* **offline_access **(optional)**: **provide refresh token 40 +This will redirect you to the login page of **iam **where your user must enter they username/password 53 53 54 -{{info}} 55 -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. 56 -{{/info}} 42 +==== Scope ==== 57 57 44 +In the request you can see a scope **parameter** 45 + 46 +* **openid : **This scope is required in oidc, it contains basic information of the user such as it username, email and full name. 47 +* **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 48 +* **team **( optional ) **: **Very same than group, but for collab, with this scope your application will know in which collab the authenticated user belong 49 + 58 58 ==== Response ==== 59 59 60 - Once theuser hasloggedin, yourappgetsanHTTP301 redirectionfollowed byanHTTP200 success response with anauthorization**code** inside. A typical response might look like:52 +After the loggin, you got a 301 redirection and 200 success http response with a **code** inside 61 61 62 -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**54 +[[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]] 63 63 64 64 (% class="box infomessage" %) 65 65 ((( 66 - Theauthorization **code**isthe partinboldintheresponseabove.58 +the code is very important for the next step here the code is //f3f04f93-hbp-482d-ac3d-demo.turtorial.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7// 67 67 ))) 68 68 61 + 69 69 === Access Token Request === 70 70 71 -(% class="wikigeneratedid" id="HRequest-1" %) 72 -Now that your app has the **authorization** **code** for a user, it can fetch the user access token 73 - 74 74 ==== Request ==== 75 75 76 - /POST:[[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/token>>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/token]]66 +Now that you have the **authorization** **code, **you can reach the **/token **endpoint and fetch the user access token 77 77 78 - withthefollowing parameters:68 +/POST : https:/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/token 79 79 80 -* grant_type: authorization_code 81 -* code: **//f3f04f93-hbp-482d-ac3d-demo.turtorial.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7//** 82 -* redirect_uri: **//[[https:~~/~~/www.getpostman.com/oauth2/callback>>https://www.getpostman.com/oauth2/callback]]//** 83 -* client_id: **//community-apps-tutorial//** 84 -* client_secret: **//your client secret obtained during client creation//** 70 +with params 85 85 86 -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.] 72 +* grant_type : authorization_code 73 +* code : //f3f04f93-hbp-482d-ac3d-demo.turtorial.7122c1d9-3f7e-4d80-9c4f-dcd244bc2ec7// 74 +* redirect_uri : [[https:~~/~~/www.getpostman.com/oauth2/callback>>https://www.getpostman.com/oauth2/callback]] 75 +* client_id : community-apps-tutorial 76 +* client_secret : your client secret obtained during client creation 87 87 88 88 [[image:Screenshot 2020-07-15 at 18.20.34.png]] 89 89 ... ... @@ -107,33 +107,31 @@ 107 107 } 108 108 ))) 109 109 110 -You rappgetsa response containing the**access token**and otherinformation.100 +You get a response containing the access token and others 111 111 112 112 == Access user info == 113 113 114 -Now that your app hasthe access token ofauser, itcanfetchtheuser'sinfo.104 +Now that your application got the access token of your user, it's really easy to fetch user info 115 115 116 -==== Request ==== 106 +(% class="box infomessage" %) 107 +((( 108 +/GET https:/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/userinfo 109 +))) 117 117 118 - /GET:[[https:~~/~~/iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/userinfo>>https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/userinfo]]111 +and just provide the access token as **Authentication** header 119 119 120 -with the following parameters: 121 - 122 -* Authorization: the access token preceded by the string "Bearer " 123 - 124 -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.] 125 - 126 126 [[image:Screenshot 2020-07-15 at 18.28.28.png||height="161" width="566"]] 127 127 128 -==== Response ==== 129 129 130 -As response you rapp receivesaJSONwith all the informationaboutthe logged user116 +As response you will have a json with all the information on the logged user, for my user 131 131 132 132 (% class="box" %) 133 133 ((( 134 134 { 135 - "sub": "fa2db206-3 ...0ebaba98e1",121 + "sub": "fa2db206-3eb4-403c-894a-810ebaba98e1", 136 136 "unit": [ 123 + "/collab-devs", 124 + "/collab-team", 137 137 "/all/institutions/switzerland/epfl", 138 138 "/all/projects/hbp/consortium/SGA2/SP05", 139 139 "/all/projects/hbp/consortium/SGA3/WP6/T6_11" ... ... @@ -146,21 +146,13 @@ 146 146 "feature:authenticate" 147 147 ], 148 148 "team": [ 149 - " **collab**-collaboratory-community-apps-**editor**"137 + "collab-collaboratory-community-apps-editor" 150 150 ], 151 151 "group": [ 152 - " **group**-collaboratory-developers",153 - " **unit**-all-projects-hbp-consortium-sga2-sp05-**administrator**"140 + "group-collaboratory-developers", 141 + "unit-all-projects-hbp-consortium-sga2-sp05-administrator" 154 154 ] 155 155 }, 156 - "mitreid-sub": "30 ...62"144 + "mitreid-sub": "305862" 157 157 } 158 158 ))) 159 - 160 -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. 161 - 162 -jupyterhub and xwiki are OIDC clients with more advanced permission management. 163 - 164 -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//. 165 - 166 -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.