123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- package main
- import (
- "github.com/gin-contrib/sessions"
- "github.com/gin-gonic/gin"
- "os"
- "fmt"
- "bytes"
- "encoding/json"
- "io/ioutil"
- //"strings"
- "net/http"
- "net/url"
- //"reflect"
- )
- var port = "8081"
- var host = "http://passport.vogue.com.cn"
- var appkey = ""
- var appsecret = ""
- const scope = "all"
- const authorizeURL = "https://api.weibo.com/oauth2/authorize"
- const tokenURL = "https://api.weibo.com/oauth2/access_token"
- const grantType = "authorization_code"
- const userURL = "https://api.weibo.com/2/users/show.json"
- type Token struct {
- Access_token string `json:"access_token"`
- Expires_in int `json:"expires_in"`
- Remind_in string `json:"remind_in"`
- Uid string `json:"uid"`
- //Data map[string]interface{} `json:data`
- }
- func main() {
- gin.SetMode(gin.ReleaseMode)//gin.ReleaseMode gin.DebugMode
- router := gin.Default()
- router.LoadHTMLGlob("templates/*")
- store := sessions.NewCookieStore([]byte("secret"))
- router.Use(sessions.Sessions("oauth2", store))
- //router.Use(Core)
- router.GET("/", Index_get)
- router.GET("/api", Api_get)
- router.GET("/token", Token_get)
- router.GET("/authorize", Authorize_get)
- router.GET("/callback", Callback_get)
- //router.POST("/simple/server/post", PostHandler)
- //router.PUT("/simple/server/put", PutHandler)
- //router.DELETE("/simple/server/delete", DeleteHandler)
- router.StaticFS("/static", http.Dir("static"))
- envport := os.Getenv("OAUTHPORT")
- envurl := os.Getenv("OAUTHHOST")
- if envurl != "" {
- host = "http://" + envurl
- }
- if envport != "" {
- port = envport
- }
- appkey = os.Getenv("APPKEY")
- appsecret = os.Getenv("APPSECRET")
- router.Run(":" + port)
- }
- func Core(c *gin.Context) {
- return
- }
- func test(c *gin.Context) {
- fmt.Println("test")
- }
- func Index_get(c *gin.Context) {
- session := sessions.Default(c)
- access_token := session.Get("access_token")
- uid := session.Get("uid")
- if access_token == nil || uid == nil {
- c.Redirect(http.StatusMovedPermanently, "authorize?refer=index")
- return
- }
- c.HTML(http.StatusOK, "index.html", gin.H{
- "access_token": access_token,
- "uid": uid,
- })
- }
- func Token_get(c *gin.Context) {
- session := sessions.Default(c)
- access_token := session.Get("access_token")
- uid := session.Get("uid")
- if access_token == nil || uid == nil {
- c.Redirect(http.StatusMovedPermanently, "authorize?refer=token")
- return
- }
- c.JSON(http.StatusOK, gin.H{"token": access_token, "uid" : uid})
- }
- func Api_get(c *gin.Context) {
- apiUrl := c.Query("url")
- session := sessions.Default(c)
- access_token := session.Get("access_token").(string)
- uid := session.Get("uid").(string)
- buffer := bytes.Buffer{}
- buffer.WriteString(apiUrl)
- buffer.WriteString("?access_token=")
- buffer.WriteString(access_token)
- buffer.WriteString("&uid=")
- buffer.WriteString(uid)
- body, err := get(buffer.String())
- if err == "no" {
- c.String(http.StatusOK, "error")
- return
- }
- //var data map[string]interface{}
- //json.Unmarshal(body, &data)
- c.HTML(http.StatusOK, "api.html", gin.H{
- "json": string(body),
- })
- }
- func Authorize_get(c *gin.Context) {
- referUrl := c.Query("refer")
- redirectURL := host + ":" + port + "/callback?refer=" + referUrl
- redirect := bytes.Buffer{}
- redirect.WriteString(authorizeURL)
- redirect.WriteString("?client_id=")
- redirect.WriteString(appkey)
- redirect.WriteString("&redirect_uri=")
- redirect.WriteString(redirectURL)
- redirect.WriteString("&response_type=code")
- //c.String(http.StatusOK, "正在为您跳转到微博进行授权登录...")
- c.Redirect(http.StatusMovedPermanently, redirect.String())
- }
- func Callback_get(c *gin.Context) {
- redirectURL := host + ":" + port + "/callback"
- code := c.Query("code")
- referUrl := c.Query("refer")
- body, err := post(tokenURL, url.Values{"client_id": {appkey}, "client_secret": {appsecret}, "grant_type": {grantType}, "code": {code}, "redirect_uri": {redirectURL}})
- if err == "no" {
- c.String(http.StatusOK, "error")
- return
- }
- //fmt.Println(string(body))
- token := Token{}
- json.Unmarshal(body, &token)
- session := sessions.Default(c)
- session.Set("access_token", token.Access_token)
- session.Set("uid", token.Uid)
- session.Set("expires_in", token.Expires_in)
- session.Set("remind_in", token.Remind_in)
- session.Save()
- indexUrl := host + ":" + port + "/"
- if referUrl == "token" {
- indexUrl = indexUrl + "token"
- }
-
- c.Redirect(http.StatusMovedPermanently, indexUrl)
- }
- //param map[string][]string
- func post(url string, param url.Values) ([]byte, string) {
- error := []byte{}
- resp, err := http.PostForm(url, param)
- if err != nil || resp.StatusCode != http.StatusOK {
- return error, "no"
- }
- defer resp.Body.Close()
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return error, "no"
- }
- //fmt.Println("type:", reflect.TypeOf(body))
- return body, "yes"
- //data = map[string]interface{}
- //return json.Unmarshal(body, &data)
- }
- func get(url string) ([]byte, string) {
- error := []byte{}
- resp, err := http.Get(url)
- if err != nil || resp.StatusCode != http.StatusOK {
- return error, "no"
- }
- defer resp.Body.Close()
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return error, "no"
- }
- return body, "yes"
- }
|