摘要:OBS提供了REST(Representational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用。本文将带你了解OBS API鉴权实现的宝典秘籍。

OBS提供了REST(Representational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用。在调用OBS的API前,需要了解OBS的鉴权认证方式。

签名计算篇

本文就将带您了解OBS的两种常见的鉴权方式——Header携带签名和URL携带签名。

1、在Header中携带签名计算

官网链接:https://support.huaweicloud.com/api-obs/obs_04_0010.html

1.1、签名的计算原理和计算方法

原理图示

计算方法

1.构造请求字符串(StringToSign)。

请求字符串的构造方法如下:

StringToSign =

HTTP-Verb + "\n" +

Content-MD5 + "\n" +

Content-Type + "\n" +

Date + "\n" +

CanonicalizedHeaders + CanonicalizedResource

2.对第一步的结果进行UTF-8编码。

3.使用SK对第二步的结果进行HMAC-SHA1签名计算。

4.对第三步的结果进行Base64编码,得到签名。

签名如以下形式(28位长度的BASE64编码的字符串):

JONydLd9zpf+Eu3IYiUjNmukHN0= 

计算示例

例:需要获取桶”obs-test”下的对象log.conf的对象ACL,如何构造请求并计算签名?

1、首先明确StringToSign的各字段:

请求方法:GET;

请求MD5:空

Content-Type:空

请求时间:Tue, 28 Jul 2020 06:29:47 GMT(即北京时间2020年7月28日14:29:47)

自定义头域(CanonicalizedHeaders):空

规范化资源(CanonicalizedResource):/obs-test/log.conf?acl

2、构造请求字符串StringToSign如下:

StringToSign = ‘’’GET

Tue, 28 Jul 2020 06:29:47 GMT

/obs-test/log.conf?acl’’’

3、根据签名算法,将StringToSign进行HMAC-SHA1计算后进行BASE64编码获得签名结果:xYlcrwT9jSaCtY0OnBE01OBR+aA=

1.2、签名计算的实现方式

以Python计算签名代码为例,供参考:

1.  import hashlib
2. import hmac
3. import binascii
4. from datetime import datetime
5.
6. # 验证信息
7. AK = '您的access_key_id'
8. SK = '您的secret_access_key_id'
9.
10. # 指定HTTP方法,可选GET/PUT/DELETE/POST/OPTIONS
11. httpMethod = "GET"
12.
13. # 指定请求的Header:Content-Type和Content-MD5
14. contentType = ""
15. conten**5 = ""
16.
17. # 使用datetime库生成时间,如果需要自定义请求时间请保持格式一致
18. date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
19.
20. # 填写canonicalizedHeaders
21. # canonicalizedHeaders = "x-obs-acl:public-read"
22. # canonicalizedHeaders = "x-obs-acl:public-read\n"+'x-obs-storage-class:WARM\n'
23. canonicalizedHeaders = ""
24.
25. # 填写CanonicalizedResource
26. # CanonicalizedResource = "/BucketName/ObjectName"
27. # CanonicalizedResource = "/BucketName/ObjectName?acl"
28. # CanonicalizedResource = "/"
29. CanonicalizedResource = "/BucketName/"
30.
31. # 生成StringToSign
32. canonical_string = httpMethod + "\n" + conten**5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedHeaders + CanonicalizedResource
33.
34. # 计算签名并进行BASE64编码
35. hashed = hmac.new(SK.encode('UTF-8'), canonical_string.encode('UTF-8'), hashlib.sha1)
36. encode_canonical = binascii.b2a_base64(hashed.digest())[:-1].decode('UTF-8')
37.
38. # 打印StringToSign以便出现问题时进行验证
39. print(canonical_string)
40.
41. # 打印签名
42. print(encode_canonical)

C语言签名算法示例:

请参考https://obs-community.obs.cn-north-1.myhuaweicloud.com/sign/signature_c.zip,下载C语言签名计算代码样例,其中:

计算签名的接口包含在sign.h头文件中。

计算签名的示例代码在main.c文件中。

可视化签名计算工具:

您也可以通过OBS提供的可视化签名计算工具来计算签名。

工具链接:

https://obs-community.obs.cn-north-1.myhuaweicloud.com/sign/header_signature.html

说明:

1. canonicalizedHeaders:表示HTTP请求头域中的OBS请求头字段,即以“x-obs-”作为前辍的头域,如“x-obs-date,x-obs-acl,x-obs-meta-*”;

a.请求头字段中关键字的的所有字符要转为小写,需要添加多个字段时,要将所有字段按照关键字的字典序从小到大进行排序;

b.在添加请求头字段时,如果有重名的字段,则需要进行合并。如:x-obs-meta-name:name1和x-obs-meta-name:name2,则需要先将重名字段的值(这里是name1和name2)以逗号分隔,合并成x-obs-meta-name:name1,name2;

c.头域中的请求头字段中的关键字不允许含有非ASCII码或不可识别字符;请求头字段中的值也不建议使用非ASCII码或不可识别字符,如果一定要使用非ASCII码或不可识别字符,需要客户端自行做编解码处理,可以采用URL编码或者Base64编码,服务端不会做解码处理;

d.当请求头字段中含有无意义空格或table键时,需要摒弃。例如:x-obs-meta-name: name(name前带有一个无意义空格),需要转换为:x-obs-meta-name:name;

e.每一个请求头字段最后都需要另起新行。

2. canonicalizedResource表示HTTP请求所指定的OBS资源,构造方式如下:

<桶名+对象名>+[子资源] …

a.通过桶绑定的自定义域名访问OBS,桶名由自定义域名表示,则为"/http://obs.ccc.com/object",其中“obs.ccc.com”为桶绑定的自定义域名。如果没有对象名,如列举桶,则为"/http://obs.ccc.com/";

b.不是通过桶绑定的自定义域名访问OBS的场景,则为"/bucket/object",如果没有对象名,如列举桶,则为"/bucket/"。如果桶名也没有,则为“/”;

c.如果有子资源,则将子资源添加进来,例如?acl,?logging。

3. 如需要使用临时AK/SK+SecurityToken的方式计算签名,计算签名的方法保持一致,但需要在头域中添加“x-obs-security-token:…”字段。

4.计算Content-MD5的方法见文末的说明。

5.其他语言计算签名的代码可详见对应语言的SDK,详见:

https://support.huaweicloud.com/sdkreference-obs/obs_02_0001.html

1.3、常见问题

1.访问OBS时报错:Signature Does Not Match

签名不匹配的情况主要有以下两种可能:

a.您没有使用正确的AK/SK,您可以检查您计算签名使用的SK和发送请求时所携带的AK是否正确且匹配;

b.您计算签名时构造的StringToSign和服务端根据接收到的HTTP请求所计算的StringToSign不匹配,您可以检查服务端返回的StringToSign,并与本地计算签名所使用的StringToSign进行对比。

如下图是服务端返回的由接收到HTTP请求所还原的StringToSign,您可以通过对比您本地的StringToSign和您发送到服务端的HTTP请求,来分析您签名计算失败的原因。

2.访问OBS时报错:Request has expired

此类情况请您检查您携带的Date是否正确,为保证请求的时效性,您所携带的Date头域必须与服务端的时间相差在15分钟以内(服务端为UTC时间),如您携带了x-obs-date头域,需检查x-obs-date的时间是否与服务端时间相差15分钟以内。

2、在URL中携带签名

OBS服务支持用户构造一个特定操作的URL,这个URL中会包含用户AK、签名、有效期、资源等信息,任何拿到这个URL的人均可执行这个操作,OBS服务收到这个请求后认为该请求就是签发URL用户自己在执行操作。例如构造一个携带签名信息的下载对象的URL,拿到相应URL的人能下载这个对象,但该URL只在Expires指定的失效时间内有效。URL中携带签名主要用于在不提供给其他人Secret Access Key的情况下,让其他人能用预签发的URL来进行身份认证,并执行预定义的操作。

官网链接https://support.huaweicloud.com/api-obs/obs_04_0011.html

2.1、签名的计算原理和计算方法

原理图示

计算方法

1.构造请求字符串(StringToSign)。

请求字符串的构造方法如下:

StringToSign =

HTTP-Verb + "\n" +

Content-MD5 + "\n" +

Content-Type + "\n" +

Date + "\n" +

CanonicalizedHeaders + CanonicalizedResource

2.对第一步的结果进行UTF-8编码。

3.使用SK对第二步的结果进行HMAC-SHA1签名计算。

4.对第三步的结果进行Base64编码,得到签名。

签名如以下形式(28位长度的BASE64编码的字符串):

JONydLd9zpf+Eu3IYiUjNmukHN0=

URL中携带的签名计算方法同Header中携带签名的签名计算方法,但是需要将Date更换为UNIX时间戳。

携带签名的URL形式如下:

http://obs-ycytest.obs.cn-north-1.myhuaweicloud.com/?AccessKeyId=YN97UCJEKF2ALJ44AHAN&Expires=1575452568&Signature=0wG/GF7XgmOatCFhwHJh0J6NrtQ=

其对应的StringToSign为

GET

1575452568

/obs-ycytest/

URL中携带的参数具体含义见下表:

计算示例

例:需要获取桶”obs-test”下的对象log.conf的对象ACL,如何构造请求并计算签名?

1、首先明确StringToSign的各字段:

请求方法:GET;

请求MD5:空

Content-Type:空

请求时间:1595918661(即北京时间2020年7月28日14:44:21)

自定义头域(CanonicalizedHeaders):空

规范化资源(CanonicalizedResource):/obs-test/log.conf?acl

2、构造请求字符串StringToSign如下:

StringToSign = ‘’’GET

1595918661

/obs-test/log.conf?acl’’’

3、根据签名算法,将StringToSign进行HMAC-SHA1计算后进行BASE64编码获得签名结果:lLcYw1fFMJv5m+MS0XenNrqJlag=

根据计算的结果,将URL拼接起来即可生成携带签名的URL如下:

http://obs-test.obs.myhuaweicloud.com/log.conf?AccessKeyId=xxx&acl&Expires=1595918661&Signature= lLcYw1fFMJv5m+MS0XenNrqJlag=

2.2、签名计算的实现方式

在URL中携带签名时,只需将Date替换为UNIX时间戳即可计算对应的签名,因此对应的代码不再赘述。

如需要使用临时AK/SK+SecurityToken的方式计算签名,计算签名的方法保持一致,但需要在对应的CanonicalizedResource中添加“?x-obs-security-token=…”字段,且计算得到的签名必须要进行URL编码。使用临时AK/SK+SecurityToken计算签名的代码如下:

1.  import hashlib
2. import hmac
3. import binascii
4. import urllib.request
5.
6. AK = 'Input Your AccessKeyId'
7. SK = 'Input Your SecretKeyId'
8. Token = 'Input Your SecurityToken'
9.
10. httpMethod = "GET"
11. contentType = ""
12. Conten**5 = ''
13. date = '1594972984'
14. canonicalizedHeaders = ''
15. CanonicalizedResource = "/messageflow/flowengine.tar.gz" + "?x-obs-security-token=" + Token
16. canonical_string = httpMethod + "\n" + Conten**5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedHeaders + CanonicalizedResource
17. hashed = hmac.new(SK.encode('UTF-8'), canonical_string.encode('UTF-8'), hashlib.sha1)
18. encode_canonical = binascii.b2a_base64(hashed.digest())[:-1].decode('UTF-8')
19.
20. url= 'messageflow.obs.myhuaweicloud.com/flowengine.tar.gz?x-obs-security-token={}&Expires={}&AccessKeyId={}&Signature={}'.format(Token, date, AK, urllib.request.quote(encode_canonical))
21. print(url)

说明:

1.在计算签名时,Date表示的是一个UNIX时间戳;

2.如果想要在浏览器中使用URL中携带签名生成的预定于URL,则计算签名时不要使用“Content-MD5”、“Content-Type”、“CanonicalizedHeaders”计算签名,否则浏览器不能携带这些参数,请求发送到服务端之后,会提示签名错误。

3、Content-MD5的计算方式

3.1、Content-MD5的计算方法

以消息内容“0123456789”为例,以下详细说明计算该字符串的Content-MD5的方法。

1.先计算MD5加密的二进制数组(128位)。

2.对这个二进制数组进行base64编码(而不是对32位字符串编码)。

以Python为例:

>>> import base64,hashlib

>>> hash = hashlib.md5()

>>> hash.update("0123456789".encode(‘utf-8’))

>>> base64.b64encode(hash.digest())

'eB5eJF1ptWaXm4bijSPyxw=='

注:hash.digest(),计算出二进制数组(128位)。

>>> hash.digest()

'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'

3.2、Content-MD5计算的实现

以Python计算文件MD5代码为例,供参考:

1.  import os
2. import base64
3. import hashlib
4.
5.
6. def md5_file_encode_by_size_offset(file_path=None, size=None, offset=None, chuckSize=None):
7. if file_path is not None and size is not None and offset is not None:
8. m = hashlib.md5()
9. with open(file_path, 'rb') as fp:
10. CHUNKSIZE = 65536 if chuckSize is None else chuckSize
11. fp.seek(offset)
12. read_count = 0
13. while read_count < size:
14. read_size = CHUNKSIZE if size - read_count >= CHUNKSIZE else size - read_count
15. data = fp.read(read_size)
16. read_count_once = len(data)
17. if read_count_once <= 0:
18. break
19. m.update(data)
20. read_count += read_count_once
21. return base64.b64encode(m.digest()).decode()
22.
23.
24. file_path = r'Input Your File Path'
25. size = os.path.getsize(file_path)
26. Conten**5 = md5_file_encode_by_size_offset(file_path=file_path, size=size, offset=0)
27. print(Conten**5)

3.3、常见问题

常见错误是直接对计算出的32位字符串进行base64编码。

# hash.hexdigest(),计算得到可见的32位字符串编码。

>>> import base64,hashlib

>>> hash = hashlib.md5()

>>> hash.update("0123456789".encode(‘utf-8’))

>>> hash.hexdigest()

'781e5e245d69b566979b86e28d23f2c7'

# 错误的MD5值进行base64编码后的结果:

>>> base64.b64encode(hash.hexdigest())

'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='

POST签名计算

OBS服务支持基于浏览器的POST上传对象请求,此类请求的签名信息通过表单的方式上传。POST上传对象的流程主要如下:

首先,创建一个安全策略,指定请求中需要满足的条件,比如:桶名、对象名前缀;

然后,创建一个基于此策略的签名,需要签名的请求表单中必须包含有效的signature和policy;

最后,创建一个表单将对象上传到桶中。

1、基于浏览器上传的表单中携带签名

官网链接:https://support.huaweicloud.com/api-obs/obs_04_0012.html

1.1、签名的计算原理和计算方法

原理图示

计算方法

1.构造请求Policy:

例如一个最简单的请求Policy如下:

Policy = {
"expiration": "2020-12-21T12:00:00.000Z",
"conditions": [
{
"bucket": "obs-test"
},
[
"eq",
"$key",
"post.txt"
],
]
}

2.对请求Policy进行UTF-8编码。

3.对第二步的结果进行Base64编码。

4.使用SK对第三步的结果进行HMAC-SHA1签名计算。

5.对第四步的结果进行Base64编码,得到签名。

签名如以下形式(28位长度的BASE64编码的字符串):

CVs7GTY6n8Gdhc74Gj+QhpbxtT4=

即:StringToSign = Base64( UTF-8-Encoding-Of( policy ) )

Signature = Base64( HMAC-SHA1( YourSecretAccessKeyID, StringToSign ) )

计算示例

例:需要通过浏览器表单上传对象”post.txt”到桶”obs-test”下,同时设置对象ACL为公共读,如何构造请求并计算签名?

1、首先构造请求Policy:

设置请求过期时间:2020-12-21T12:00:00.000Z

桶名:obs-test

对象ACL:public-read

匹配条件:对象名=post.txt

2、构造Policy如下:

{
"expiration": "2020-12-21T12:00:00.000Z",
"conditions": [
{
"bucket": "obs-test"
},
{
"x-obs-acl": "public-read"
},
[
"eq",
"$key",
"post.txt"
],
]
}

3、根据签名算法,将Policy进行UTF-8编码后再进行BASE64编码,再进行HMAC-SHA1计算后获得签名结果:odouyqpyXcYlKQz7G1/EaUNfJUE=

1.2、签名计算的实现方式

以Python计算签名代码为例,供参考:

1.  import hashlib
2. import hmac
3. import binascii
4.
5. # 验证信息
6. SK = '您的secret_access_key_id'
7.
8. # Policy
9. canonical_string = '''''{
10. "expiration": "2020-12-21T12:00:00.000Z",
11. "conditions": [
12. {
13. "bucket": "obs-test"
14. },
15. {
16. "x-obs-acl": "public-read"
17. },
18. [
19. "eq",
20. "$key",
21. "post.txt"
22. ],
23. ]
24. }'''
25.
26. policybase64 = binascii.b2a_base64(canonical_string.encode('utf-8'))
27. policybase64 = policybase64[:-1].decode('UTF-8')
28. # Policy的Base64编码
29. print(policybase64)
30. hashed = hmac.new(SK.encode('UTF-8'), policybase64.encode('UTF-8'), hashlib.sha1)
31. encode_canonical = binascii.b2a_base64(hashed.digest())[:-1].decode('UTF-8')
32. # 签名
33. print(encode_canonical)

说明:

1. policy使用json格式,conditions可以支持 { } 和 [ ] 两种方式,{ }中包含表单元素的key和value两项,以冒号分隔;[ ]中包含条件类型、key、value三项,以逗号分隔,元素key之前使用$字符表示变量;

2.下表内的字符都必须进行转义:

1.3、基于浏览器表单上传的Policy与其他方式的StringToSign的异同

基于浏览器表单上传时,匹配条件可以设置为“Starts-With”,即前缀匹配而非精确匹配,因此在上传时适用于更广的场景。

OBS API实战篇

OBS提供了REST(Representational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用。

通过前述的签名计算方法,想必大家对OBS的API鉴权方式已经有所了解,下文将通过Postman、cURL、编码等方法对OBS的API进行实战调用。

1、OBS支持的API列表

详见官网链接:https://support.huaweicloud.com/api-obs/obs_04_0005.html

2、构造请求

本节主要介绍OBS RESTful 请求的构成

2.1、请求URI

OBS根据桶和对象以及所对应的子资源参数来确定具体的URI,当需要进行资源操作时,可以使用这个URI地址。

URI的一般格式为(方括号内为可选项):

protocol://[bucket.]domain[:port][/object][?param]

URI中参数的具体含义如下:

2.2、请求方法

HTTP方法(也称为操作或动词),它告诉服务你正在请求什么类型的操作。

华为云对象存储支持以下的REST请求方法:

2.3、请求消息头

请求消息头是可选的附加请求头字段,如指定的URI和HTTP方法所要求的字段。以下是OBS的公共请求消息头:

2.4、请求消息体(可选)

请求消息体通常以结构化格式(如JSON或XML)发出,与请求消息头中Content-type对应,传递除请求消息头之外的内容。若请求消息体中参数支持中文,则中文字符必须为UTF-8编码。

每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。

3、发起请求

本文以列举桶内对象为例,说明各种客户端发起请求调用OBS API的流程。

3.1、构造请求

1、按照上述2.1构建请求URI,本例中的URI即为“bucketname.obs.cn-north-4.myhuaweicloud.com”;

2.按照上述2.2选择对应的请求方法,本例使用“GET”请求方法;

3.按照2.3选择对应的请求消息头,由于本例的请求为GET请求,因此Content-Type、Content-Length、Content-MD5都设置为空字符串;

其中“Authorization”请求头中的签名需要根据前文所述的签名计算方法进行计算:

StringToSign=GET

Thu, 03 Sep 2020 01:57:08 GMT

/bucketname/

将其进行加密并进行编码后,获得Authorization头域为:OBS Y5IBJTPVZBXYXVLKVOSZ:L0h7P/XDJltLkT/arekZy3Ysh68=

4.传入对应的请求消息体,本例中不涉及。

3.2、使用PostMan发起请求

Postman是一种网页调试与发送网页http请求的chrome插件。我们可以用来很方便的模拟get或者post或者其他方式的请求来调试接口。

由于Postman具有可视化的操作界面,因此调试接口过程不再赘述。

注意事项:

当在请求中不手动指定“Content-Type”等头域时,Postman会自动生成头域,可能会导致签名不匹配的情况,可通过点击红框中的按钮将隐藏头域显示以便定位此类问题;

3.3、使用cURL发起请求

cURL是利用URL语法在命令行方式下工作的文件传输工具。利用cURL可以调试OBS提供的接口。在使用curl调试OBS API时,需要用到以下的语法:

-H HTTP请求头

-X HTTP方法

调用OBS提供的列举对象接口时,在Linux终端下执行以下命令:

curl -X GET https://bucketname.obs.cn-north-4.myhuaweicloud.com -H "Content-Type:" -H "Authorization:OBS Y5IBJTPVZBXYXVLKVOSZ:*****" -H "Date:Tue, 25 Aug 2020 03:16:39 GMT" –kv

即可获取到接口返回的信息。

注意事项:

curl命令所携带的 –k参数允许curl使用非安全的ssl连接并且传输数据(证书不受信),而-v参数能输出更详细的参数便于debug。

3.4、使用HTTP请求库发起请求

通过编码发起请求,以Python常见的HTTP请求库requests库为例,代码如下:(示例代码中已集成签名计算)

1.  import hashlib
2. import hmac
3. import binascii
4. from datetime import datetime
5. import requests
6. import time
7.
8. AK = "Input Your Access Key Id"
9. SK = "Input Your Secret Access Key Id"
10.
11.
12. time = time.time()
13. time = int(time)
14. time = str(time)
15.
16. # 计算签名
17. httpMethod = 'GET'
18. contentType = ''
19. Conten**5 = ''
20. date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
21. canonicalizedHeaders = ''
22. canonicalizedResource = '/obs-yuchenyu/'
23. canonical_string = httpMethod + "\n" + Conten**5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedHeaders + canonicalizedResource
24. hashed = hmac.new(SK.encode('UTF-8'), canonical_string.encode('UTF-8'), hashlib.sha1)
25. encode_canonical = binascii.b2a_base64(hashed.digest())[:-1].decode('UTF-8')
26.
27. url = 'https://obs-yuchenyu.obs.cn-north-4.myhuaweicloud.com/'
28.
29. # 生成请求头
30. headers = {
31. 'Date': date,
32. 'Authorization': 'OBS {}:{}'.format(AK, encode_canonical),
33. 'Content-Type': '',
34. 'Content-MD5': ''
35. }
36.
37.
38. # 发送请求
39. resp = requests.get(url, headers=headers, verify=False)
40. print(resp.status_code)
41. print(resp.headers)
42. print(resp.content.decode('utf-8'))
返回结果如下:
"C:\Program Files\Python37\python.exe" "D:/OBS PythonSDK/OBS_API.py"
200
{'via': 'proxy A', 'Date': 'Tue, 25 Aug 2020 03:25:59 GMT', 'Server': 'OBS', 'Connection': 'Keep-Alive', 'x-obs-id-2': '32AAAQAAEAABAAAQAAEAABAAAQAAEAABCTDP5fqiYrOrqBlcJ91P0KqhCGTp+5Pl', 'Content-Type': 'application/xml', 'Content-Length': '28217', 'x-obs-request-id': '0000017423A6A7AA44CB43873F3DBCD6', 'x-obs-bucket-location': 'cn-north-4'}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ListBucketResult xmlns="http://obs.myhwclouds.com/doc/2015-06-30/">……
Process finished with exit code 0

点击关注,第一时间了解华为云新鲜技术~

OBS鉴权实现的宝典秘籍,速拿!的更多相关文章

  1. OBS studio最新版配置鉴权推流

    这两天在看百度的LSS音视频直播服务的sdk..sdk看了一圈,基本上只能操作个流什么的,查看流列表,域名之类的.按照百度这块的描述自己去实现这个显得不是那么明智我感觉.其次就是百度LSS的教程用的O ...

  2. ApiAuthValue鉴权机制总结

    一.背景介绍 1.自动化的配置工具autoconfig介绍 项目开发过程中,有些配置会随着运行环境的变化而各不相同.如jdbc驱动的配置,在开发环境可能链接到开发本地的数据库,测试环境则有一套测试专用 ...

  3. 搭建一个分布式MongoDB鉴权集群

    今天休假在家,测试并搭建了一个replica set shard MongoDB鉴权集群.replica set shard 鉴权集群中文资料比较少,本文是个人笔记,同时也希望对后来者有所帮助.本文仅 ...

  4. 开放平台鉴权以及OAuth2.0介绍

    OAuth 2.0 协议 OAuth是一个开发标准,允许用户授权第三方网站或应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的内容. OAuth 2.0 ...

  5. 取消mod_sofia的呼叫鉴权

    FreeSWITCH中默认的SIP呼叫是要鉴权的,流程如下. 终端 FreeSWITCH A -----Invite------> FS A <----Trying------ FS A ...

  6. android 高德地图出现【定位失败key鉴权失败】

    如题:android 高德地图出现[定位失败key鉴权失败] 原因:使用的是debug模式下的SHA1,发布的版本正确获取SHA1的方式见: 方法二使用 keytool(jdk自带工具),按照如下步骤 ...

  7. RESTful登录设计(基于Spring及Redis的Token鉴权)

    转载自:http://www.scienjus.com/restful-token-authorization/ http://m.blog.csdn.net/article/details?id=4 ...

  8. .NET 统一用户管理 -- 统一鉴权

    统一鉴权 目的 为什么要统一鉴权了,每一个业务系统几乎都离不开,用户,角色,权限 这个 3个基础功能,为了避免各个系统各自去开发一套权限管理等基础功能,也同时轻松管理每个用户的全部权限. 怎么做   ...

  9. linux上svn连接visual svn server时ssl鉴权失败,问题解决(转)

    场景:1.在windows 7上安装了visual svn server作为自己的svn服务器. 2.在虚拟机centos 6.3上使用svn客户端check代码,报错: [plain] view p ...

  10. 带鉴权信息的SIP呼叫

    带鉴权信息的SIP呼叫 INVITE sip:1000@192.168.50.34SIP/2.0 Via: SIP/2.0/UDP192.168.50.32:2445;branch=z9hG4bK-d ...

随机推荐

  1. K8s部署轻量级日志收集系统EFK(elasticsear + filebeat + kibana)

    目录 K8s部署EFK(elasticsear + filebeat + kibana)日志收集 一.准备镜像 二.搭建Elasticsearch + kibana 1.在可执行kubectl命令的服 ...

  2. 利用信号量SemaphoreSlim实现PaddleOCR的线程安全访问

    Wlkr.Core.ThreadUtils 项目背景 早在PaddleOCR 2.2版本时期,认识了周杰大佬的PaddleSharp项目,试用其中PaddleOCR时,发现它在改为web api调用时 ...

  3. MUH and Cube Walls 题解

    MUH and Cube Walls 前言 怎么题解区同质化这么严重,16 篇题解全是 差分 + KMP,就没有人写别的做法吗. (好吧其实是我一开始没想到差分才有了这么多奇怪做法) 题目大意 给定两 ...

  4. SQL Server事务及隔离级别

    事务的并发操作可能出现的问题 中文 英文 描述 脏读 Dirty Reads 事务2读到了事务1未提交的事务,事务1随后回滚,但事务2读到了事务1的"中间数据". 在Read Un ...

  5. List、Set与 Map

    目录 1. List接口和常用方法 1.1 List接口基本介绍 1.2 List接口的三种遍历方式 2. ArrayList 2.1 注意事项 2.2 ArrayList的底层操作机制源码分析(重点 ...

  6. Unity3D 选择焦点切换

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 2023 SHCTF-校外赛道 Crypto—Wp

    WEEK1 立正 wl hgrfhg 4gNUx4NgQgEUb4NC64NHxZLg636V6CDBiDNUHw8HkapH :jdoi vl vlkw ~xrb wd nrrT Y: 凯撒解密,偏 ...

  8. 操作PDF的方法

    PDF的内容提取.转换见上篇 PDF操作: 旋转 删除 合并 拆分 转成图片 导出内嵌资源图片 两页合并成一页 添加.去除密码 添加水印 PDF旋转某一页 var document = pdfView ...

  9. shell 语法介绍

    大家好,我是蓝胖子,在日常开发中或多或少都会接触到shell脚本,可以说会shell脚本是一位后端开发的基本功,今天我将会花上一篇文章总结下常见的shell的语法,学完本篇,相信简单的shell脚本就 ...

  10. Linux配置静态IP解决无法访问网络问题

    Linux系统安装成功之后只是单机无网络状态,我们需要配置Linux静态IP来确保服务器可以正常连接互联网 1.首先安装ifconfig Centos7安装成功后,高版本会把ping命令给移除了,所以 ...