Hi,

it was raised on this list already and I agree, that tying the Plugin
Portal to a Google Account sound like a not too good idea. I for
example use my google account only for a minimal set of services and
don't see why that should change.

At this point Plugin Portal 3 implements an OpenID Connect Implicit
Flow for Authentication. But I think other OAuth2 based authentication
providers can be integrated with to much pain. I prototyped the idea as
a dropwizard java application, that only implements the authentication
flow. That application currently supports:

- Google
- GitHub
- Amazon

Other Authentication providers can be integrated. Required is, that the
authentication provider uses OAuth2 and provides a Userinfo endpoint,
that returns:

- a stable ID
- Name
- Email

All providers listed above follow (loosly) the OpenID Connect "code"
flow.

>From my reading of https://oauth.apache.org/api.html it should be
possible to implement a authentication for apache committer account (if
really requested).

The sample code an be foud here:

https://github.com/matthiasblaesing/PluginPortalDemo

You can test the authentication flow youself. I made the application
available on:

https://doppel-helix.eu:9000/

Be warned: all requests are logged. I will not be able to see your
passwords (that is the whole point of the OAuth protocol), but the
requested information (profile data).

1. Open https://doppel-helix.eu:9000/oauth/

You will get a JSON document, that lists als authentication providers I
configured.

Code: 
https://github.com/matthiasblaesing/PluginPortalDemo/blob/master/src/main/java/eu/doppel_helix/dev/pluginportaldemo/resources/AuthenticationResource.java#L69

2. From that list get the id of the provider you want to test and open
   
https://doppel-helix.eu:9000/oauth/start/<id>
For example to authenticate with github you would run:
https://doppel-helix.eu:9000/oauth/start/github

Code: 
https://github.com/matthiasblaesing/PluginPortalDemo/blob/master/src/main/java/eu/doppel_helix/dev/pluginportaldemo/resources/AuthenticationResource.java#L75

3. Now you will be redirected to the authentication provider. 

If you have not yet signed in to your account, you will be asked to do
so. This is communication between you and the authentication provider,
so my code will not be involved and thus not be able to access your
password. After sign in you will be asked if you consent, that the Demo
Application accesses your profile data (depending on authentication
provider this is differently worded). If you consent, you will be
redirect back to my code.

4. You are redirected to https://doppel-helix.eu:9000/oauth/code

The authentication provider calls the above mentioned URL with a
"code". That code is exchanged for an access token:

Code: 
https://github.com/matthiasblaesing/PluginPortalDemo/blob/master/src/main/java/eu/doppel_helix/dev/pluginportaldemo/resources/AuthenticationResource.java#L114

With the access token the userinfo endpoint is contacted to query the
userdata:

Code: 
https://github.com/matthiasblaesing/PluginPortalDemo/blob/master/src/main/java/eu/doppel_helix/dev/pluginportaldemo/resources/AuthenticationResource.java#L126

The userdata is converted to a unified format and returned:

Code: 
https://github.com/matthiasblaesing/PluginPortalDemo/blob/master/src/main/java/eu/doppel_helix/dev/pluginportaldemo/resources/AuthenticationResource.java#L133

At this point the session could be updated to the logged in state.


This was done as a java application to keep my sanity - but it can be
(and I'm willing to do that) transferred to PHP. I will only do that if
there is agreement, that this is a good idea, as this also needs
updates to the persistent data. We can't use the email as an identifier
anymore (but even google says, that the email can change, while their
provided ID will be constant), so we need to indirect that to a user
table:

user:
  id - internal id
  idp_id - ID of the identity provider
  idp_user_id - ID the identity provider assigned to the user
  name - Real name (if needed)
  nick - a choosen and displayed nickname
  email - Emailadress from last login (if needed)


id would be the primary key, idp_id and idp_user_id form a compound key
and must be unique too.


Thank you to anyone, that made it to this point and/or tested the
sample. I'd like to hear, what you think.

Matthias










---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@netbeans.apache.org
For additional commands, e-mail: dev-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists



Reply via email to