如何使用python中的Azure存储Blob对用户进行身份验证?

时间:2018-12-23 20:36:19

标签: python azure azure-active-directory azure-storage azure-storage-blobs

我正在寻找一种针对Azure blob容器对用户进行身份验证的方法。使用存储帐户的访问密钥,示例代码(是的,新手警报)可以很好地工作,但是感觉很不舍得像是将所有存储帐户的全部控制权交给任何窃取凭据的人一样。

(来自https://azure.microsoft.com/en-us/resources/samples/storage-python-getting-started/的auth示例如下所示:

const assert = require("assert")
const client = require("mongodb").MongoClient
const config = require("../config")
let _db
module.exports = {
    getDb,
    initDb
}

function initDb() {
  if (_db) {
    console.warn("Trying to init DB again!");
    return Promise.resolve(true)
  }
  return client.connect(config.db.connectionString, 
  config.db.connectionOptions)
}

function getDb() {
  assert.ok(_db, "Db has not been initialized. Please called init first.")
  return _db
}

//////////////////////


const {initDb, getDb} = require("./db")
const app = require("express")()
const port = 3001

app.use("/", exampleRoute)

initDb().
    then(_ =>bootServer(port))
    .catch(console.log)

function bootServer(port) {
    app.listen(port, function (err) {
        if (err) {
            Promise.reject(err)
        }
        console.log("API Up and running on port " + port)
        Promise.resolve()
    })   
}    

function exampleRoute(req, res){
 const db = getDb();
 //Do things with your database connection
 res.json(results);
}

我在Active Directory中设置了一个服务用户,该用户在存储帐户中的角色限制了对Blob容器的使用;除了将新项目写入一个特定的容器外,它什么也不做。

我想在python脚本中使用该用户的凭据,以便在泄漏时无法访问其他存储资源。有没有一种方法可以根据资源/ ID组合生成访问密钥,或者采用类似的方法来实现?我一直在浏览Azure Python API文档,但没有取得任何进展。

编辑:我已经取得了一些进展。我创建了具有适当IAM限制的服务主体。当我打电话给我时,这似乎已成功登录:

block_blob_service = BlockBlobService(account_name='<acc>', account_key='<key>')

哪个给了我一个对象

credentials = ServicePrincipalCredentials( client_id=<>, secret=<>, tenant=<>)
print(credentials)

如果我给它不正确的凭据,则会出错。所以,太好了,我有一个凭据对象。怎么办?我找不到将其输入BlockBlobService的方法。

1 个答案:

答案 0 :(得分:3)

您可以参考此article来从应用程序向Azure Active Directory进行身份验证以访问Blob。

1。Register your application with an Azure AD tenant

2。Grant your registered app permissions to Azure Storage

3.Python代码:

import adal
from azure.storage.blob import (
    BlockBlobService,
    ContainerPermissions,
)
from azure.storage.common import (
    TokenCredential
)

RESOURCE = "https://storage.azure.com/"
clientId = "***"
clientSecret = "***="
tenantId = "***"
authority_url = "https://login.microsoftonline.com/" + tenantId

print(authority_url)
context = adal.AuthenticationContext(authority_url)

token = context.acquire_token_with_client_credentials(
    RESOURCE,
    clientId,
    clientSecret)
print(token)

tokenCre = TokenCredential(token["accessToken"])

blobService = BlockBlobService(account_name="***", token_credential=tokenCre)

blobService.list_blobs(container_name="***")
for i in blobService.list_blobs(container_name="***"):
    print(i.properties.name)