mirror of
https://github.com/wekan/wekan.git
synced 2025-12-16 15:30:13 +01:00
- [OAuth2 Login on Standalone Wekan](https://github.com/wekan/wekan/wiki/OAuth2). For example, Rocket.Chat can provide OAuth2 login to Wekan.
Also, if you have Rocket.Chat using LDAP/SAML/Google/etc for logging into Rocket.Chat, then same users can login to Wekan when Rocket.Chat is providing OAuth2 login to Wekan. Thanks to salleman33 and xet7 ! Closes #234
This commit is contained in:
parent
96173ad431
commit
39312a075e
8 changed files with 139 additions and 29 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
3stack:presence@1.1.2
|
3stack:presence@1.1.2
|
||||||
accounts-base@1.4.0
|
accounts-base@1.4.0
|
||||||
|
accounts-oauth@1.1.15
|
||||||
accounts-password@1.5.0
|
accounts-password@1.5.0
|
||||||
aldeed:collection2@2.10.0
|
aldeed:collection2@2.10.0
|
||||||
aldeed:collection2-core@1.2.0
|
aldeed:collection2-core@1.2.0
|
||||||
|
|
@ -119,6 +120,8 @@ mquandalle:mousetrap-bindglobal@0.0.1
|
||||||
mquandalle:perfect-scrollbar@0.6.5_2
|
mquandalle:perfect-scrollbar@0.6.5_2
|
||||||
npm-bcrypt@0.9.3
|
npm-bcrypt@0.9.3
|
||||||
npm-mongo@2.2.33
|
npm-mongo@2.2.33
|
||||||
|
oauth@1.2.1
|
||||||
|
oauth2@1.2.0
|
||||||
observe-sequence@1.0.16
|
observe-sequence@1.0.16
|
||||||
ongoworks:speakingurl@1.1.0
|
ongoworks:speakingurl@1.1.0
|
||||||
ordered-dict@1.0.9
|
ordered-dict@1.0.9
|
||||||
|
|
@ -140,6 +143,8 @@ reload@1.1.11
|
||||||
retry@1.0.9
|
retry@1.0.9
|
||||||
routepolicy@1.0.12
|
routepolicy@1.0.12
|
||||||
rzymek:fullcalendar@3.8.0
|
rzymek:fullcalendar@3.8.0
|
||||||
|
salleman:accounts-oidc@1.0.9
|
||||||
|
salleman:oidc@1.0.9
|
||||||
service-configuration@1.0.11
|
service-configuration@1.0.11
|
||||||
session@1.1.7
|
session@1.1.7
|
||||||
sha@1.0.9
|
sha@1.0.9
|
||||||
|
|
|
||||||
10
CHANGELOG.md
10
CHANGELOG.md
|
|
@ -1,10 +1,16 @@
|
||||||
# Upcoming Wekan release
|
# Upcoming Wekan release
|
||||||
|
|
||||||
This release fixes the following bugs:
|
This release adds the following new features:
|
||||||
|
|
||||||
|
- [OAuth2 Login on Standalone Wekan](https://github.com/wekan/wekan/wiki/OAuth2). For example, Rocket.Chat can provide OAuth2 login to Wekan.
|
||||||
|
Also, if you have Rocket.Chat using LDAP/SAML/Google/etc for logging into Rocket.Chat, then same users can login to Wekan when
|
||||||
|
Rocket.Chat is providing OAuth2 login to Wekan.
|
||||||
|
|
||||||
|
and fixes the following bugs:
|
||||||
|
|
||||||
- [Move labels back to original place at minicard](https://github.com/wekan/wekan/issues/1842).
|
- [Move labels back to original place at minicard](https://github.com/wekan/wekan/issues/1842).
|
||||||
|
|
||||||
Thanks to GitHub users hever and xet7 for their contributions.
|
Thanks to GitHub users hever, salleman33 and xet7 for their contributions.
|
||||||
|
|
||||||
# v1.35 2018-08-23 Wekan release
|
# v1.35 2018-08-23 Wekan release
|
||||||
|
|
||||||
|
|
|
||||||
14
Dockerfile
14
Dockerfile
|
|
@ -18,6 +18,12 @@ ARG MATOMO_WITH_USERNAME
|
||||||
ARG BROWSER_POLICY_ENABLED
|
ARG BROWSER_POLICY_ENABLED
|
||||||
ARG TRUSTED_URL
|
ARG TRUSTED_URL
|
||||||
ARG WEBHOOKS_ATTRIBUTES
|
ARG WEBHOOKS_ATTRIBUTES
|
||||||
|
ARG OAUTH2_CLIENT_ID
|
||||||
|
ARG OAUTH2_SECRET
|
||||||
|
ARG OAUTH2_SERVER_URL
|
||||||
|
ARG OAUTH2_AUTH_ENDPOINT
|
||||||
|
ARG OAUTH2_USERINFO_ENDPOINT
|
||||||
|
ARG OAUTH2_TOKEN_ENDPOINT
|
||||||
|
|
||||||
# Set the environment variables (defaults where required)
|
# Set the environment variables (defaults where required)
|
||||||
# DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
# DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||||
|
|
@ -38,7 +44,13 @@ ENV BUILD_DEPS="apt-utils gnupg gosu wget curl bzip2 build-essential python git
|
||||||
MATOMO_WITH_USERNAME=false \
|
MATOMO_WITH_USERNAME=false \
|
||||||
BROWSER_POLICY_ENABLED=true \
|
BROWSER_POLICY_ENABLED=true \
|
||||||
TRUSTED_URL="" \
|
TRUSTED_URL="" \
|
||||||
WEBHOOKS_ATTRIBUTES=""
|
WEBHOOKS_ATTRIBUTES="" \
|
||||||
|
OAUTH2_CLIENT_ID="" \
|
||||||
|
OAUTH2_SECRET="" \
|
||||||
|
OAUTH2_SERVER_URL="" \
|
||||||
|
OAUTH2_AUTH_ENDPOINT="" \
|
||||||
|
OAUTH2_USERINFO_ENDPOINT="" \
|
||||||
|
OAUTH2_TOKEN_ENDPOINT=""
|
||||||
|
|
||||||
# Copy the app to the image
|
# Copy the app to the image
|
||||||
COPY ${SRC_PATH} /home/wekan/app
|
COPY ${SRC_PATH} /home/wekan/app
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,25 @@ services:
|
||||||
# What to send to Outgoing Webhook, or leave out. Example, that includes all that are default: cardId,listId,oldListId,boardId,comment,user,card,commentId .
|
# What to send to Outgoing Webhook, or leave out. Example, that includes all that are default: cardId,listId,oldListId,boardId,comment,user,card,commentId .
|
||||||
# example: WEBHOOKS_ATTRIBUTES=cardId,listId,oldListId,boardId,comment,user,card,commentId
|
# example: WEBHOOKS_ATTRIBUTES=cardId,listId,oldListId,boardId,comment,user,card,commentId
|
||||||
- WEBHOOKS_ATTRIBUTES=''
|
- WEBHOOKS_ATTRIBUTES=''
|
||||||
|
# OAuth2 docs: https://github.com/wekan/wekan/wiki/OAuth2
|
||||||
|
# OAuth2 Client ID, for example from Rocket.Chat. Example: abcde12345
|
||||||
|
# example: OAUTH2_CLIENT_ID=abcde12345
|
||||||
|
- OAUTH2_CLIENT_ID=''
|
||||||
|
# OAuth2 Secret, for example from Rocket.Chat: Example: 54321abcde
|
||||||
|
# example: OAUTH2_SECRET=54321abcde
|
||||||
|
- OAUTH2_SECRET=''
|
||||||
|
# OAuth2 Server URL, for example Rocket.Chat. Example: https://chat.example.com
|
||||||
|
# example: OAUTH2_SERVER_URL=https://chat.example.com
|
||||||
|
- OAUTH2_SERVER_URL=''
|
||||||
|
# OAuth2 Authorization Endpoint. Example: /oauth/authorize
|
||||||
|
# example: OAUTH2_AUTH_ENDPOINT=/oauth/authorize
|
||||||
|
- OAUTH2_AUTH_ENDPOINT=''
|
||||||
|
# OAuth2 Userinfo Endpoint. Example: /oauth/userinfo
|
||||||
|
# example: OAUTH2_USERINFO_ENDPOINT=/oauth/userinfo
|
||||||
|
- OAUTH2_USERINFO_ENDPOINT=''
|
||||||
|
# OAuth2 Token Endpoint. Example: /oauth/token
|
||||||
|
# example: OAUTH2_TOKEN_ENDPOINT=/oauth/token
|
||||||
|
- OAUTH2_TOKEN_ENDPOINT=''
|
||||||
depends_on:
|
depends_on:
|
||||||
- wekandb
|
- wekandb
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -479,23 +479,20 @@ if (Meteor.isServer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.services.oidc) {
|
if (user.services.oidc) {
|
||||||
var email = user.services.oidc.email.toLowerCase();
|
const email = user.services.oidc.email.toLowerCase();
|
||||||
|
|
||||||
user.username = user.services.oidc.username;
|
user.username = user.services.oidc.username;
|
||||||
user.emails = [{ address: email,
|
user.emails = [{ address: email, verified: true }];
|
||||||
verified: true }];
|
const initials = user.services.oidc.fullname.match(/\b[a-zA-Z]/g).join('').toUpperCase();
|
||||||
var initials = user.services.oidc.fullname.match(/\b[a-zA-Z]/g).join('').toUpperCase();
|
user.profile = { initials, fullname: user.services.oidc.fullname };
|
||||||
user.profile = { initials: initials, fullname: user.services.oidc.fullname };
|
|
||||||
|
|
||||||
// see if any existing user has this email address or username, otherwise create new
|
// see if any existing user has this email address or username, otherwise create new
|
||||||
var existingUser = Meteor.users.findOne({$or: [{'emails.address': email}, {'username':user.username}]});
|
const existingUser = Meteor.users.findOne({$or: [{'emails.address': email}, {'username':user.username}]});
|
||||||
console.log("user to create : ");
|
|
||||||
console.log(user);
|
|
||||||
if (!existingUser)
|
if (!existingUser)
|
||||||
return user;
|
return user;
|
||||||
|
|
||||||
// copy across new service info
|
// copy across new service info
|
||||||
var service = _.keys(user.services)[0];
|
const service = _.keys(user.services)[0];
|
||||||
existingUser.services[service] = user.services[service];
|
existingUser.services[service] = user.services[service];
|
||||||
existingUser.emails = user.emails;
|
existingUser.emails = user.emails;
|
||||||
existingUser.username = user.username;
|
existingUser.username = user.username;
|
||||||
|
|
|
||||||
|
|
@ -63,23 +63,27 @@ Meteor.startup(() => {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (Meteor.isServer) {
|
if (Meteor.isServer) {
|
||||||
ServiceConfiguration.configurations.upsert(
|
|
||||||
{ service: 'oidc' },
|
if(process.env.OAUTH2_CLIENT_ID !== '') {
|
||||||
{
|
|
||||||
$set: {
|
ServiceConfiguration.configurations.upsert( // eslint-disable-line no-undef
|
||||||
loginStyle: 'redirect',
|
{ service: 'oidc' },
|
||||||
clientId: 'CLIENT_ID',
|
{
|
||||||
secret: 'SECRET',
|
$set: {
|
||||||
serverUrl: 'https://my-server',
|
loginStyle: 'redirect',
|
||||||
authorizationEndpoint: '/oauth/authorize',
|
clientId: process.env.OAUTH2_CLIENT_ID,
|
||||||
userinfoEndpoint: '/oauth/userinfo',
|
secret: process.env.OAUTH2_SECRET,
|
||||||
tokenEndpoint: '/oauth/token',
|
serverUrl: process.env.OAUTH2_SERVER_URL,
|
||||||
idTokenWhitelistFields: [],
|
authorizationEndpoint: process.env.OAUTH2_AUTH_ENDPOINT,
|
||||||
requestPermissions: ['openid']
|
userinfoEndpoint: process.env.OAUTH2_USERINFO_ENDPOINT,
|
||||||
|
tokenEndpoint: process.env.OAUTH2_TOKEN_ENDPOINT,
|
||||||
|
idTokenWhitelistFields: [],
|
||||||
|
requestPermissions: ['openid'],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
# All supported keys are defined here together with descriptions and default values
|
# All supported keys are defined here together with descriptions and default values
|
||||||
|
|
||||||
# list of supported keys
|
# list of supported keys
|
||||||
keys="MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES"
|
keys="MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT"
|
||||||
|
|
||||||
# default values
|
# default values
|
||||||
DESCRIPTION_MONGODB_BIND_UNIX_SOCKET="mongodb binding unix socket:\n"\
|
DESCRIPTION_MONGODB_BIND_UNIX_SOCKET="mongodb binding unix socket:\n"\
|
||||||
|
|
@ -81,3 +81,28 @@ KEY_TRUSTED_URL="trusted-url"
|
||||||
DESCRIPTION_WEBHOOKS_ATTRIBUTES="What to send to Outgoing Webhook, or leave out. Example, that includes all that are default: cardId,listId,oldListId,boardId,comment,user,card,commentId ."
|
DESCRIPTION_WEBHOOKS_ATTRIBUTES="What to send to Outgoing Webhook, or leave out. Example, that includes all that are default: cardId,listId,oldListId,boardId,comment,user,card,commentId ."
|
||||||
DEFAULT_WEBHOOKS_ATTRIBUTES=""
|
DEFAULT_WEBHOOKS_ATTRIBUTES=""
|
||||||
KEY_WEBHOOKS_ATTRIBUTES="webhooks-attributes"
|
KEY_WEBHOOKS_ATTRIBUTES="webhooks-attributes"
|
||||||
|
|
||||||
|
DESCRIPTION_OAUTH2_CLIENT_ID="OAuth2 Client ID, for example from Rocket.Chat. Example: abcde12345"
|
||||||
|
DEFAULT_OAUTH2_CLIENT_ID=""
|
||||||
|
KEY_OAUTH2_CLIENT_ID="oauth2-client-id"
|
||||||
|
|
||||||
|
DESCRIPTION_OAUTH2_SECRET="OAuth2 Secret, for example from Rocket.Chat: Example: 54321abcde"
|
||||||
|
DEFAULT_OAUTH2_SECRET=""
|
||||||
|
KEY_OAUTH2_SECRET="oauth2-secret"
|
||||||
|
|
||||||
|
DESCRIPTION_OAUTH2_SERVER_URL="OAuth2 Server URL, for example Rocket.Chat. Example: https://chat.example.com"
|
||||||
|
DEFAULT_OAUTH2_SERVER_URL=""
|
||||||
|
KEY_OAUTH2_SERVER_URL="oauth2-server-url"
|
||||||
|
|
||||||
|
DESCRIPTION_OAUTH2_AUTH_ENDPOINT="OAuth2 authorization endpoint. Example: /oauth/authorize"
|
||||||
|
DEFAULT_OAUTH2_AUTH_ENDPOINT=""
|
||||||
|
KEY_OAUTH2_AUTH_ENDPOINT="oauth2-auth-endpoint"
|
||||||
|
|
||||||
|
DESCRIPTION_OAUTH2_USERINFO_ENDPOINT="OAuth2 userinfo endpoint. Example: /oauth/userinfo"
|
||||||
|
DEFAULT_OAUTH2_USERINFO_ENDPOINT=""
|
||||||
|
KEY_OAUTH2_USERINFO_ENDPOINT="oauth2-userinfo-endpoint"
|
||||||
|
|
||||||
|
DESCRIPTION_OAUTH2_TOKEN_ENDPOINT="OAuth2 token endpoint. Example: /oauth/token"
|
||||||
|
DEFAULT_OAUTH2_TOKEN_ENDPOINT=""
|
||||||
|
KEY_OAUTH2_TOKEN_ENDPOINT="oauth2-token-endpoint"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,48 @@ echo -e "\t$ snap set $SNAP_NAME WEBHOOKS_ATTRIBUTES='cardId,listId,oldListId,bo
|
||||||
echo -e "\t-Disable the Webhooks Attributes of Wekan to send all default ones:"
|
echo -e "\t-Disable the Webhooks Attributes of Wekan to send all default ones:"
|
||||||
echo -e "\t$ snap set $SNAP_NAME WEBHOOKS_ATTRIBUTES=''"
|
echo -e "\t$ snap set $SNAP_NAME WEBHOOKS_ATTRIBUTES=''"
|
||||||
echo -e "\n"
|
echo -e "\n"
|
||||||
|
echo -e "OAuth2 Client ID, for example from Rocket.Chat. Example: abcde12345"
|
||||||
|
echo -e "To enable the OAuth2 Client ID of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_CLIENT_ID='54321abcde'"
|
||||||
|
echo -e "\t-Disable the OAuth2 Client ID of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_CLIENT_ID=''"
|
||||||
|
echo -e "\n"
|
||||||
|
echo -e "OAuth2 Secret, for example from Rocket.Chat. Example: 54321abcde"
|
||||||
|
echo -e "To enable the OAuth2 Secret of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_SECRET='54321abcde'"
|
||||||
|
echo -e "\t-Disable the OAuth2 Secret of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_SECRET=''"
|
||||||
|
echo -e "\n"
|
||||||
|
echo -e "OAuth2 Server URL, for example Rocket.Chat. Example: https://chat.example.com"
|
||||||
|
echo -e "To enable the OAuth2 Server URL of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_SERVER_URL='https://chat.example.com'"
|
||||||
|
echo -e "\t-Disable the OAuth2 Server URL of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_SERVER_URL=''"
|
||||||
|
echo -e "\n"
|
||||||
|
echo -e "OAuth2 Server URL, for example Rocket.Chat. Example: https://chat.example.com"
|
||||||
|
echo -e "To enable the OAuth2 Server URL of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_SERVER_URL='https://chat.example.com'"
|
||||||
|
echo -e "\t-Disable the OAuth2 Server URL of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_SERVER_URL=''"
|
||||||
|
echo -e "\n"
|
||||||
|
echo -e "OAuth2 Authorization Endpoint. Example: /oauth/authorize""
|
||||||
|
echo -e "To enable the OAuth2 Authorization Endpoint of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_AUTH_ENDPOINT='/oauth/authorize'"
|
||||||
|
echo -e "\t-Disable the OAuth2 Authorization Endpoint of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_AUTH_ENDPOINT=''"
|
||||||
|
echo -e "\n"
|
||||||
|
echo -e "OAuth2 Userinfo Endpoint. Example: /oauth/userinfo""
|
||||||
|
echo -e "To enable the OAuth2 Userinfo Endpoint of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_USERINFO_ENDPOINT='/oauth/authorize'"
|
||||||
|
echo -e "\t-Disable the OAuth2 Userinfo Endpoint of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_USERINFO_ENDPOINT=''"
|
||||||
|
echo -e "\n"
|
||||||
|
echo -e "OAuth2 Token Endpoint. Example: /oauth/token""
|
||||||
|
echo -e "To enable the OAuth2 Token Endpoint of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_TOKEN_ENDPOINT='/oauth/token'"
|
||||||
|
echo -e "\t-Disable the OAuth2 Token Endpoint of Wekan:"
|
||||||
|
echo -e "\t$ snap set $SNAP_NAME OAUTH2_TOKEN_ENDPOINT=''"
|
||||||
|
echo -e "\n"
|
||||||
# parse config file for supported settings keys
|
# parse config file for supported settings keys
|
||||||
echo -e "wekan supports settings keys"
|
echo -e "wekan supports settings keys"
|
||||||
echo -e "values can be changed by calling\n$ snap set $SNAP_NAME <key name>='<key value>'"
|
echo -e "values can be changed by calling\n$ snap set $SNAP_NAME <key name>='<key value>'"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue