oauth.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package model
  2. import (
  3. "strconv"
  4. "fmt"
  5. )
  6. const (
  7. OauthTypeGithub string = "github"
  8. OauthTypeGoogle string = "google"
  9. OauthTypeOidc string = "oidc"
  10. OauthTypeWebauth string = "webauth"
  11. )
  12. type Oauth struct {
  13. IdModel
  14. Op string `json:"op"`
  15. OauthType string `json:"oauth_type"`
  16. ClientId string `json:"client_id"`
  17. ClientSecret string `json:"client_secret"`
  18. RedirectUrl string `json:"redirect_url"`
  19. AutoRegister *bool `json:"auto_register"`
  20. Scopes string `json:"scopes"`
  21. Issuer string `json:"issuer"`
  22. TimeModel
  23. }
  24. type OauthUser struct {
  25. OpenId string `json:"open_id" gorm:"not null;index"`
  26. Name string `json:"name"`
  27. Username string `json:"username"`
  28. Email string `json:"email"`
  29. VerifiedEmail bool `json:"verified_email,omitempty"`
  30. }
  31. func (ou *OauthUser) ToUser(user *User, overideUsername bool) {
  32. if overideUsername {
  33. user.Username = ou.Username
  34. }
  35. user.Email = ou.Email
  36. user.Nickname = ou.Name
  37. }
  38. type OauthUserBase struct {
  39. Name string `json:"name"`
  40. Email string `json:"email"`
  41. }
  42. type OidcUser struct {
  43. OauthUserBase
  44. Sub string `json:"sub"`
  45. VerifiedEmail bool `json:"email_verified"`
  46. PreferredUsername string `json:"preferred_username"`
  47. }
  48. func (ou *OidcUser) ToOauthUser() *OauthUser {
  49. return &OauthUser{
  50. OpenId: ou.Sub,
  51. Name: ou.Name,
  52. Username: ou.PreferredUsername,
  53. Email: ou.Email,
  54. VerifiedEmail: ou.VerifiedEmail,
  55. }
  56. }
  57. type GoogleUser struct {
  58. OauthUserBase
  59. FamilyName string `json:"family_name"`
  60. GivenName string `json:"given_name"`
  61. Id string `json:"id"`
  62. Picture string `json:"picture"`
  63. VerifiedEmail bool `json:"verified_email"`
  64. }
  65. func (gu *GoogleUser) ToOauthUser() *OauthUser {
  66. return &OauthUser{
  67. OpenId: gu.Id,
  68. Name: fmt.Sprintf("%s %s", gu.GivenName, gu.FamilyName),
  69. Username: gu.GivenName,
  70. Email: gu.Email,
  71. VerifiedEmail: gu.VerifiedEmail,
  72. }
  73. }
  74. type GithubUser struct {
  75. OauthUserBase
  76. Id int `json:"id"`
  77. Login string `json:"login"`
  78. }
  79. func (gu *GithubUser) ToOauthUser() *OauthUser {
  80. return &OauthUser{
  81. OpenId: strconv.Itoa(gu.Id),
  82. Name: gu.Name,
  83. Username: gu.Login,
  84. Email: gu.Email,
  85. VerifiedEmail: true,
  86. }
  87. }
  88. type OauthList struct {
  89. Oauths []*Oauth `json:"list"`
  90. Pagination
  91. }