golang 请求带验证信息的坑

最近用golang 和python对接接口,由于之前验证那块没有设置好,然后又为了进度,最近决定用http自带的basic 验证,

php的代码很快就验证通过了

/**
     * @param $url
     * @param $filename
     * @param $path
     * @param $type 上传代码
     */
    private function upload_file($url,$path){
        $data = array(
            'avatar'=>new \CURLFile(realpath($path))
        );
        $ch = curl_init();

        //设置帐号和帐号名
        curl_setopt($ch, CURLOPT_USERPWD, 'xxx:xxxx' );
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true );
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_getinfo($ch);
        $return_data = curl_exec($ch);
        curl_close($ch);
        return $return_data;
    }

python由于用的是2.7的版本,代码如下

# -*- coding: utf-8 -*-

import urllib2
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='http://localhost:8080/v1/xxx/index',
                          user='xxx',
                          passwd='xxxx')
opener = urllib2.build_opener(auth_handler)

以下是正确的请求方式
#import requests
#req = requests.post('http://localhost:8080/v1/xxxx/index', auth=('xxxx', 'xxxx'),params={"lists":[{"1212"}]})
#print(req.text)

golang 这边的验证大概代码如下,用的是beego框架;然后写上一个filter的中间键自已实现的验证,弄死都读不到Authorization,

package middleware

import (
    "encoding/base64"
    "github.com/astaxie/beego/context"
    "github.com/astaxie/beego"
)
const(
    HeaderAuthorization = "Authorization"
    basic = "Basic"
)

func Author(ctx *context.Context) bool {
    auth := ctx.Input.Header(HeaderAuthorization)
    l := len(basic)

    if len(auth) > l+1 && auth[:l] == basic {
        b, err := base64.StdEncoding.DecodeString(auth[l+1:])
        if err != nil {
            return false
        }
        cred := string(b)
        for i := 0; i < len(cred); i++ {
            if cred[i] == ':' {
                // Verify credentials
                return  validator(cred[:i], cred[i+1:])
            }
        }
    }
    return false
}
func validator(user string ,pass string) bool {
    if user == beego.AppConfig.String("auth::appkey") && pass == beego.AppConfig.String("auth::appsecret"){
        return true
    }
    return false
}

后面还是强大的http://stackoverflow.com/questions/21936332/idiomatic-way-of-requiring-http-basic-auth-in-go 这个上面找到了答案

func main() {

    //    atcd := dispatcher.NewAtcDispatcher(4)
    //    atcd.Run()

    if beego.BConfig.RunMode == "dev" {
        beego.BConfig.WebConfig.DirectoryIndex = true
        beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
    //} else {

        //权限检查
        var FilterAuth = func(ctx *context.Context) {
            if !middleware.Author(ctx) {
                ctx.ResponseWriter.Header().Set("WWW-Authenticate", `Basic realm="MY REALM"`)
                ctx.ResponseWriter.WriteHeader(401)
                ctx.ResponseWriter.Write([]byte("{\"ResultCode\": 401,\"ResultMsg\": \"你没有权限\"}\n"))
            }
        }
        beego.InsertFilter("/v1/*", beego.BeforeStatic, FilterAuth)
    }

    beego.Run()
}

然后就可以通过:curl http://xxx:xxx@127.0.0.1:8080/v1/xx/12 这样访问就没有问题了

 

golang requiring HTTP Basic Auth 

时间: 2024-09-30 10:14:42

golang 请求带验证信息的坑的相关文章

AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】_AngularJS

本文实例讲述了AngularJS验证信息框架的封装插件用法.分享给大家供大家参考,具体如下: AngularJS 的表单验证规则 angular.js 的表单验证规则有 required(必填项),type="number"(必须为数字),type="email"(必须为邮箱地址),ng-max(最大值),ng-min(最小值),ng-max-length(最大长度),ng-min-length(最小长度),ng-pattern(正则验证)等等,而且angular写

iteminserting-怎么终止Formview在验证信息失败的时候终止添加数据呢

问题描述 怎么终止Formview在验证信息失败的时候终止添加数据呢 如题目所示 主要就是我在Formview+sqldatasouce向数据库插入信息的时候 会验证信息 并弹出提示框 所以在Formview的ItemInserting事件中写出代码验证 可是我在插入信息的时候 点击添加,Formview会弹出提示框 但是数据库也会添加数据 这是为什么 应该怎么才能在验证错误的时候 终止信息插入呢 ... 本人菜鸟 求高手 大神指点谢谢

应用-安卓如何监听短信发送,代码发送不是系统自带的信息?

问题描述 安卓如何监听短信发送,代码发送不是系统自带的信息? 我指的是别的应用用代码发送短信,就是sendTextMessage那个函数,别的应用悄悄发送的话,我如何能监测到并实时的提示我是否发送呢? 解决方案 发送最后都是调用系统提供的短信接口,因为没有其它接口可以调用手机模块的. 解决方案二: 短信发送会用固定的波段,这个手机很容易知道的. 解决方案三: 这个应该是用广播来实现吧 解决方案四: 应该是jni的一些功能,而且需要系统权限 解决方案五: 360可以做到,你在要求发短信时,给出提示

client发的请求接收返回信息时用send来接收,其余的由receive来接收,怎么改?求大神帮忙

问题描述 client发的请求接收返回信息时用send来接收,其余的由receive来接收,怎么改?求大神帮忙 sever的请求都友client的receive来接收,client发的请求接收返回信息时用send来接收,怎么改下?求大神帮忙,我只会大概写了下代码,菜鸟急需用! package test; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; impo

java邮箱验证email-谁做过java邮箱验证,将验证信息发送到指定的邮箱上去

问题描述 谁做过java邮箱验证,将验证信息发送到指定的邮箱上去 求案例,求API接口文档,求指点···················

java问题-java实现验证发送邮箱功能(如何给指定邮箱发送验证信息)

问题描述 java实现验证发送邮箱功能(如何给指定邮箱发送验证信息) package org.ouyang.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.m

mvc4-asp.net如何获取上一次请求的RouteData信息

问题描述 asp.net如何获取上一次请求的RouteData信息 asp.net如何获取上一次请求的RouteData信息?????????? 解决方案 每次得到route在你的控制器中存入session或者 tempdata,下次就能得到. 解决方案二: asp.net获取服务器信息Asp.net 获取服务器信息Asp.net 获取服务器信息

java 调用 rest 接口 怎么写请求行的信息?

问题描述 java 调用 rest 接口 怎么写请求行的信息? Rest接口格式:每一个请求通常由三部分组成:请求行.请求报头.请求正文(可选). 请求样例: Post /services/ita/login HTTP/1.1 Host: https://: Accept:application/json;charset=UTF-8;Content-Type:application/json; charset=UTF-8 Accept-Language:zh_CN X-Auth-User:use

angularjs-angularJS jsonp的请求带参数

问题描述 angularJS jsonp的请求带参数 myUrl = "http://localhost:8090/api/testcallback=JSON_CALLBACK"; $http.jsonp(myUrl).success( function(data){ alert(data); } ); 当请求的地址为:http://localhost:8090/project/login?name=aaa&password=123456,应该怎么改 ? 解决方案 myUrl