BuildRedirectURL 构造跳转到 Discourse 的 SSO 发起 URL。 returnURL 是 Discourse 认证完成后的回调地址(即本服务的 callback 端点)。
(returnURL string)
| 53 | // BuildRedirectURL 构造跳转到 Discourse 的 SSO 发起 URL。 |
| 54 | // returnURL 是 Discourse 认证完成后的回调地址(即本服务的 callback 端点)。 |
| 55 | func (d *DiscourseConfig) BuildRedirectURL(returnURL string) (string, error) { |
| 56 | nonce, err := d.generateNonce() |
| 57 | if err != nil { |
| 58 | return "", fmt.Errorf("generate nonce: %w", err) |
| 59 | } |
| 60 | payload := url.Values{ |
| 61 | "nonce": {nonce}, |
| 62 | "return_sso_url": {returnURL}, |
| 63 | }.Encode() |
| 64 | encoded := base64.StdEncoding.EncodeToString([]byte(payload)) |
| 65 | sig := d.sign(encoded) |
| 66 | target := d.URL + "/session/sso_provider" |
| 67 | return fmt.Sprintf("%s?sso=%s&sig=%s", target, url.QueryEscape(encoded), sig), nil |
| 68 | } |
| 69 | |
| 70 | // ParseCallback 验证并解析 Discourse 回调的 sso/sig 参数,返回 Discourse 用户名。 |
| 71 | func (d *DiscourseConfig) ParseCallback(rawSSO, sig string) (string, error) { |
no test coverage detected