关于第三方授权的问题

10 条回复
34 次浏览
  1. 之前的授权 app 可以删除吗?目前不行
  2. 我可以编辑授权 app 的回调地址吗?
  3. 现在我什么也做不了,有计划吗
大平衡者
Admin

用户角度:现在已授权的可以撤销。
开发者角度的话,是需要删除已授权的应用和编辑回调地址吗?

都听我说!
OP

@Jimmy 今天调试时有个疑惑需要解答下,咱这个授权成功时返回的状态码好像是 201,并非常见的 200

下面是我写的代码,刚开始写的判断条件是 200,一直在报错,这是修改后的代码.

复制
// exchangeToken 用 code 换 access_token
func (s *OAuthService) exchangeToken(p *entity.OAuthProvider, code, redirectURI string) (*tokenResponse, error) {
	params := url.Values{}
	params.Set("grant_type", "authorization_code")
	params.Set("code", code)
	params.Set("redirect_uri", redirectURI)
	params.Set("client_id", p.ClientID)
	params.Set("client_secret", p.ClientSecret)

	resp, err := http.PostForm(p.TokenURL, params)
	if err != nil {
		global.Logger.WithFields(map[string]interface{}{
			"provider": p.Name,
		}).Errorf("oauth: 请求 token 接口失败: %v", err)
		return nil, err
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
		global.Logger.WithFields(map[string]interface{}{
			"provider": p.Name,
			"status": resp.StatusCode,
			"body": string(body),
		}).Errorf("oauth: token 接口返回异常")
		return nil, fmt.Errorf("token 接口返回 %d", resp.StatusCode)
	}

	// 支持 wrapped 格式:{"c":0,"m":"...","d":{...}}
	if p.ResponseFormat == "wrapped" {
		var wrapped struct {
			C int `json:"c"`
			M string `json:"m"`
			D json.RawMessage `json:"d"`
		}
		if err := json.Unmarshal(body, &wrapped); err != nil {
			global.Logger.WithFields(map[string]interface{}{
				"provider": p.Name,
			}).Errorf("oauth: 解析 wrapped token 响应失败: %v", err)
			return nil, err
		}
		if wrapped.C != 0 {
			global.Logger.WithFields(map[string]interface{}{
				"provider": p.Name,
				"code": wrapped.C,
				"message": wrapped.M,
			}).Errorf("oauth: token 接口业务错误")
			return nil, fmt.Errorf("token 接口业务错误: code=%d", wrapped.C)
		}
		body = wrapped.D
	}

	var result tokenResponse
	if err := json.Unmarshal(body, &result); err != nil {
		global.Logger.WithFields(map[string]interface{}{
			"provider": p.Name,
		}).Errorf("oauth: 解析 token 响应失败: %v", err)
		return nil, err
	}
	return &result, nil
}

发表一个评论

R保持