social_qq.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. // api reference: http://wiki.open.t.qq.com/index.php/OAuth2.0%E9%89%B4%E6%9D%83/Authorization_code%E6%8E%88%E6%9D%83%E6%A1%88%E4%BE%8B
  5. package user
  6. import (
  7. "encoding/json"
  8. "net/http"
  9. "net/url"
  10. "github.com/gogits/gogs/models"
  11. "code.google.com/p/goauth2/oauth"
  12. )
  13. type SocialQQ struct {
  14. Token *oauth.Token
  15. *oauth.Transport
  16. reqUrl string
  17. }
  18. func (s *SocialQQ) Type() int {
  19. return models.OT_QQ
  20. }
  21. func init() {
  22. qq := &SocialQQ{}
  23. name := "qq"
  24. config := &oauth.Config{
  25. ClientId: "801497180", //base.OauthService.GitHub.ClientId, // FIXME: panic when set
  26. ClientSecret: "16cd53b8ad2e16a36fc2c8f87d9388f2", //base.OauthService.GitHub.ClientSecret,
  27. Scope: "all",
  28. AuthURL: "https://open.t.qq.com/cgi-bin/oauth2/authorize",
  29. TokenURL: "https://open.t.qq.com/cgi-bin/oauth2/access_token",
  30. }
  31. qq.reqUrl = "https://open.t.qq.com/api/user/info"
  32. qq.Transport = &oauth.Transport{
  33. Config: config,
  34. Transport: http.DefaultTransport,
  35. }
  36. SocialMap[name] = qq
  37. }
  38. func (s *SocialQQ) SetRedirectUrl(url string) {
  39. s.Transport.Config.RedirectURL = url
  40. }
  41. func (s *SocialQQ) UserInfo(token *oauth.Token, URL *url.URL) (*BasicUserInfo, error) {
  42. var data struct {
  43. Data struct {
  44. Id string `json:"openid"`
  45. Name string `json:"name"`
  46. Email string `json:"email"`
  47. } `json:"data"`
  48. }
  49. var err error
  50. // https://open.t.qq.com/api/user/info?
  51. //oauth_consumer_key=APP_KEY&
  52. //access_token=ACCESSTOKEN&openid=openid
  53. //clientip=CLIENTIP&oauth_version=2.a
  54. //scope=all
  55. var urls = url.Values{
  56. "oauth_consumer_key": {s.Transport.Config.ClientId},
  57. "access_token": {token.AccessToken},
  58. "openid": URL.Query()["openid"],
  59. "oauth_version": {"2.a"},
  60. "scope": {"all"},
  61. }
  62. r, err := http.Get(s.reqUrl + "?" + urls.Encode())
  63. if err != nil {
  64. return nil, err
  65. }
  66. defer r.Body.Close()
  67. if err = json.NewDecoder(r.Body).Decode(&data); err != nil {
  68. return nil, err
  69. }
  70. return &BasicUserInfo{
  71. Identity: data.Data.Id,
  72. Name: data.Data.Name,
  73. Email: data.Data.Email,
  74. }, nil
  75. }