feat: add OIDC feature support. (#373)

1. add nonce parameter.
2. add sub in userinfo endpoint.

Signed-off-by: 0x2a <stevesough@gmail.com>
This commit is contained in:
Steve0x2a 2021-12-15 21:42:16 +08:00 committed by GitHub
parent 370e835499
commit 98f6cc0085
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 22 additions and 10 deletions

View File

@ -61,6 +61,7 @@ type RequestForm struct {
type Response struct {
Status string `json:"status"`
Msg string `json:"msg"`
Sub string `json:"sub"`
Data interface{} `json:"data"`
Data2 interface{} `json:"data2"`
}
@ -217,8 +218,14 @@ func (c *ApiController) GetAccount() {
}
organization := object.GetMaskedOrganization(object.GetOrganizationByUser(user))
c.ResponseOk(user, organization)
resp := Response{
Status: "ok",
Sub: userId,
Data: user,
Data2: organization,
}
c.Data["json"] = resp
c.ServeJSON()
}
// GetHumanCheck ...

View File

@ -51,8 +51,8 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob
redirectUri := c.Input().Get("redirectUri")
scope := c.Input().Get("scope")
state := c.Input().Get("state")
code := object.GetOAuthCode(userId, clientId, responseType, redirectUri, scope, state)
nonce := c.Input().Get("nonce")
code := object.GetOAuthCode(userId, clientId, responseType, redirectUri, scope, state, nonce)
resp = codeToResponse(code)
if application.HasPromptPage() {

View File

@ -136,8 +136,9 @@ func (c *ApiController) GetOAuthCode() {
redirectUri := c.Input().Get("redirect_uri")
scope := c.Input().Get("scope")
state := c.Input().Get("state")
nonce := c.Input().Get("nonce")
c.Data["json"] = object.GetOAuthCode(userId, clientId, responseType, redirectUri, scope, state)
c.Data["json"] = object.GetOAuthCode(userId, clientId, responseType, redirectUri, scope, state, nonce)
c.ServeJSON()
}

View File

@ -175,7 +175,7 @@ func CheckOAuthLogin(clientId string, responseType string, redirectUri string, s
return "", application
}
func GetOAuthCode(userId string, clientId string, responseType string, redirectUri string, scope string, state string) *Code {
func GetOAuthCode(userId string, clientId string, responseType string, redirectUri string, scope string, state string, nonce string) *Code {
user := GetUser(userId)
if user == nil {
return &Code{
@ -192,7 +192,7 @@ func GetOAuthCode(userId string, clientId string, responseType string, redirectU
}
}
accessToken, err := generateJwtToken(application, user)
accessToken, err := generateJwtToken(application, user, nonce)
if err != nil {
panic(err)
}

View File

@ -31,17 +31,19 @@ var tokenJwtPrivateKey string
type Claims struct {
User
Nonce string `json:"nonce,omitempty"`
jwt.RegisteredClaims
}
func generateJwtToken(application *Application, user *User) (string, error) {
func generateJwtToken(application *Application, user *User, nonce string) (string, error) {
nowTime := time.Now()
expireTime := nowTime.Add(time.Duration(application.ExpireInHours) * time.Hour)
user.Password = ""
claims := Claims{
User: *user,
User: *user,
Nonce: nonce,
RegisteredClaims: jwt.RegisteredClaims{
Issuer: beego.AppConfig.String("origin"),
Subject: user.Id,

View File

@ -44,7 +44,7 @@ function oAuthParamsToQuery(oAuthParams) {
}
// code
return `?clientId=${oAuthParams.clientId}&responseType=${oAuthParams.responseType}&redirectUri=${oAuthParams.redirectUri}&scope=${oAuthParams.scope}&state=${oAuthParams.state}`;
return `?clientId=${oAuthParams.clientId}&responseType=${oAuthParams.responseType}&redirectUri=${oAuthParams.redirectUri}&scope=${oAuthParams.scope}&state=${oAuthParams.state}&nonce=${oAuthParams.nonce}`;
}
export function getApplicationLogin(oAuthParams) {

View File

@ -82,6 +82,7 @@ export function getOAuthGetParameters(params) {
const redirectUri = queries.get("redirect_uri");
const scope = queries.get("scope");
const state = queries.get("state");
const nonce = queries.get("nonce")
if (clientId === undefined || clientId === null) {
// login
@ -94,6 +95,7 @@ export function getOAuthGetParameters(params) {
redirectUri: redirectUri,
scope: scope,
state: state,
nonce: nonce,
};
}
}