Üçüncü taraf belirteç sunucuları için Azure IoT istemci SDK 'Sı desteği

IoT Hub erişimi denetleme makalesinde, üçüncü taraf belirteç hizmetinin IoT Hub ile nasıl tümleştirileceği gösterilmektedir. Bu makalede, Azure IoT istemci SDK 'larının her birinde paylaşılan erişim imzası (SAS) belirteci kimlik doğrulaması desteği özetlenmektedir. Ayrıca, her dil için karşılık gelen SDK 'Yı kullanarak bir cihaz uygulamasında uygulanması gerekenleri ve DeviceConnect ya da ModuleConnect paylaşılan erişim ilkeleri için cihaz kapsamlı veya modül kapsamlı belirteçleri kullanmayı da özetler.

Bağlam ve sorun

Geçerli Azure IoT Hub güvenliği belgeleri, Azure IoT istemci SDK 'larını kullanarak IoT cihazları tarafından IoT Hub SAS kimlik doğrulaması için üçüncü taraf belirteç sunucu modelini ele almaktadır. Bununla birlikte, son bir kurumsal katılım sırasında müşterinin yaptığı yanlış varsayımlar, daha fazla açıklama olmadan, Azure IoT istemci SDK 'lerinde varsayılan olarak uygulanan destek düzeyi hakkında yanıltıcı bir izlenim geliştirmenize yol açabilir.

Bu makalede, bu görevlendirmenin öğrenilmesi ve cihazların üçüncü taraf belirteç sunucusu kimlik doğrulamasına ulaşmak için her SDK 'da yapılması gerekenleri açıklığa kavuşturması anlatılmaktadır. Bu makale, Azure IoT istemci SDK 'sında üçüncü taraf belirteç-sunucu deseninin desteğiyle ilgili yanlış varsayımlar yapmayı da önler.

Çözüm

Azure IoT istemcisi SDK 'ları, her birinin kimlik doğrulama ve belirteç yönetimi işlevselliğini tamamlaması için bazı özel kodlar gerektiren SAS belirteci kimlik doğrulaması için farklı düzeylerde destek sağlar.

Belirteç değerlendirmesi sıklığı, seçilen aktarım protokolüne (MQTT, AMQP veya HTTPS) bağlıdır. Çeşitleme, belirteçlerin ve oturum zaman aşımlarının proaktif yenilenmesini destekleyen protokol özelliğine bağlıdır. Yalnızca AMQP, öngörülü yenileme desteği uygular. Bu, diğer aktarımların SAS belirteci kimlik doğrulama hatasında bağlantıyı kapatacağı ve yeni bir bağlantı işlemi gerçekleştirmesi gerektiği anlamına gelir. Bu, istemci için olası pahalı bir bağlantı işlemidir.

SAS kimlik doğrulaması başarısız olursa, aktarım uygulaması tarafından, "bağlantı durumu değiştirildi" olay işleyicisi tarafından cihaz uygulaması içinde işlenebilecek bir hata oluşur. Bu tür bir işleyicinin uygulanması hata nedeniyle genellikle cihaz uygulamasının durmasına neden olur. Olay işleyicisi ve belirteç yenileme işlevinin doğru uygulamasıyla, aktarımlar bağlantıyı yeniden deneyebilir.

Aşağıdaki şekilde, üçüncü taraf belirteç-sunucu kalıbı gösterilmektedir:

Üçüncü taraf belirteç-sunucu düzeninin çizimi

Aşağıdaki şekilde, mobil ağ operatörü tümleştirmesiyle Azure IoT istemcisi SDK 'sında uygulama desteği gösterilmektedir:

Mobil ağ operatörü tümleştirmesiyle Azure IoT istemcisi SDK 'sında uygulama desteği akış çizelgesi

Örnek uygulamalar GitHub Azure örnekleri deposuna dahildir.

Sorunlar ve dikkat edilmesi gerekenler

Bu düzenin uygulanıp uygulamacağına karar verirken aşağıdaki noktaları göz önünde bulundurun:

  • Azure IoT Hub cihaz sağlama hizmeti (Azure DPS) Istemci SDK 'ları SAS belirteci kimlik doğrulamasını desteklemez. Azure DPS REST APISAS belirteci kimlikdoğrulamasını destekler. Bu nedenle, Azure DPS 'yi SAS kimlik doğrulaması için bir üçüncü taraf belirteç hizmeti ile kullanmak için, bir cihaz uygulamasının Azure DPS REST API kullanarak cihaz DPS işlemini uygulaması gerekir.

  • Bu, ilk kayıt isteği işlemini yaptıktan sonra, DPS işlemi başarılı veya başarısız olana kadar işletimsel durum API 'sini yoklayarak oluşur. Başarılı olduğunda, cihaz sağlama ayrıntıları Azure DPS REST API çalışma zamanı kaydıylaisteyerek elde edilebilir.

Başvur

Bu düzenin kullanılacağı durumlar

Çeşitli Azure IoT Istemci SDK 'larını kullanarak IoT cihazlarından Azure IoT Hub kimlik doğrulaması yapmak istediğiniz zaman bu modele Kullanıcı olmanız gerekir. SAS belirteci kimlik doğrulaması için istemci SDK 'larını kullanmak yerine, tüm taşıma mekanizmaları için öngörülü yenileme desteğinin uygulanmasını sağlamak üzere Azure DPS REST API kullanın.

Örnekler

Aşağıdaki bölümler, katıştırılmış C, .NET, Java ve Python gibi farklı programlama dilleri için kullanabileceğiniz örnekler sunmaktadır.

C için Azure IoT Hub cihaz SDK 'Sı ve Embedded C için Azure IoT Hub cihaz SDK 'Sı

Aşağıdaki yaklaşım, Azure IoT C SDK 'Sı veya Azure IoT Embedded C SDK kullanılarak oluşturulan cihaz uygulamalarında kullanılabilir. Ne SDK, SAS belirteci yaşam süresi yönetimi sağlamaz, bu nedenle bir SAS belirteci ömür Yöneticisi özelliği uygulamanız gerekir.

SAS belirteçleri, Devicesastoken üyesini belirtece ayarlayarak ve devicekey null yaparak IOTHUB_CLIENT_CONFIG yapısı aracılığıyla kullanılabilir. Protocolgatewayhostnamegibi diğer kullanılmayan değerlerin de null olarak ayarlanması gerekir.

CONFIG = (IOTHUB\_CLIENT\_CONFIG\*)MALLOC(SIZEOF (IOTHUB\_CLIENT\_CONFIG));

CONFIG-\>PROTOCOL = PROTOCOL;

CONFIG-\>DEVICEID = DEVICEID;

CONFIG-\>IOTHUBNAME = IOTHUBNAME;

CONFIG-\>IOTHUBSUFFIX = IOTHUBSUFFIX;

CONFIG-\>DEVICEKEY = 0;

CONFIG-\>DEVICESASTOKEN = TOKEN;

CONFIG-\>PROTOCOLGATEWAYHOSTNAME = 0;
`The created IOTHUB\_CLIENT\_CONFIG can then be provided to the IoTHubDeviceClient\_Create function to establish a DeviceClient instance.`
IF ((IOTHUBCLIENTHANDLE = IOTHUBDEVICECLIENT\_CREATE(CONFIG)) == NULL)

{

(VOID)PRINTF("ERROR: IOTHUBCLIENTHANDLE IS NULL!\\R\\N");

}
`To capture SAS token authentication failures, a handler needs to be implemented for the IoTHubDeviceClient\_SetConnectionStatusCallback.`
(VOID)IOTHUBDEVICECLIENT\_SETCONNECTIONSTATUSCALLBACK(IOTHUBCLIENTHANDLE,
CONNECTION\_STATUS\_CALLBACK, NULL);

Connection_status_callback, üçüncü taraf belirteç hizmeti aracılığıyla SAS belirtecinin yenilenmesini tetikleyebilen IOTHUB_CLIENT_CONNECTION_EXPIRED_SAS_TOKEN IOTHUB_CLIENT_CONNECTION_STATUS_REASON yakalayabilir. Bu, tüm taşımaların bağlantı sorunlarını yakalama için gereklidir, ancak özellikle proaktif SAS belirteci yenilemeyi desteklemeyen taşıtlar için gereklidir. Cihaz uygulamalarının "işletimsel" döngüsü sırasında sürekli olarak çalıştırılan bir işlev olarak proaktif SAS belirteç ömrü yönetimi uygulanabilir. Belirtecin yaşam süresinin sık olarak değerlendirilmesinin yanı sıra, gerekli olduğunda belirteç yenilemesi de öngörülebilir bir şekilde çalıştırılabilir.

C SDK 'ları için SAS belirteci kimlik doğrulama uygulama Özeti:

  1. IOTHUB_CLIENT_CONNECTION_EXPIRED_SAS_TOKEN olayı yakalamak ve belirteç yenilemeyi tetiklemek için bir ConnectionStatusCallback işleyicisi uygulayın.

  2. Cihaz SAS belirtecini IoTHubDeviceClient_Create sağlamak için bir IOTHUB_CLIENT_CONFIG kullanın.

  3. Cihaz uygulamasının işlem döngüsünün bir parçası olarak proaktif SAS belirteci yaşam süresi yönetimini uygulayın.

Başvur

.NET için Azure IoT Hub cihaz SDK 'Sı

.NET için Azure IoT istemci SDK 'sı, soyut DeviceAuthenticationWithTokenRefresh sınıfı aracılığıyla SAS belirteci ömür yönetimi desteği uygular. Bu sınıfın somut bir uygulamasını belirteç yenileme işlevselliği ekleyerek bir DeviceClient. Create yöntemine kimlik doğrulama yöntemi olarak girebilirsiniz. Taşıma uygulamaları, kimlik doğrulama yöntemi aracılığıyla belirteci gerektiği şekilde otomatik olarak yeniler. Bağlantı değişikliklerini yakalamak ve aktarımlar tarafından oluşturulan özel durumları engellemek için bir ConnectionStatusChangesHandler gereklidir.

DeviceAuthenticationWithTokenRefreash sınıfına dayalı örnek uygulama

INTERNAL CLASS STSDEVICEAUTHENTICATIONWITHTOKENREFRESH :
DEVICEAUTHENTICATIONWITHTOKENREFRESH

{

PRIVATE READONLY STRING \_STSCONNECTURL =
"HTTP://LOCALHOST:8080/STS/AZURE/TOKEN/OPERATIONS?SR={0}/DEVICES/{1}";

PRIVATE CONST INT DEFAULTTIMETOLIVESECONDS = 1 \* 60 \* 60;

PRIVATE CONST INT DEFAULTBUFFERPERCENTAGE = 15;

PUBLIC STSDEVICEAUTHENTICATIONWITHTOKENREFRESH(STRING DEVICEID, INT
SUGGESTEDTIMETOLIVESECONDS, INT TIMEBUFFERPERCENTAGE) : BASE(DEVICEID,
SUGGESTEDTIMETOLIVESECONDS, TIMEBUFFERPERCENTAGE)

{

IF (STRING.ISNULLORWHITESPACE(DEVICEID))

{

THROW NEW ARGUMENTNULLEXCEPTION(NAMEOF(DEVICEID));

}

}

PROTECTED OVERRIDE TASK\<STRING\> SAFECREATENEWTOKEN(STRING IOTHUB, INT
SUGGESTEDTIMETOLIVE)

{

STRING RESULT;

STRING URL = STRING.FORMAT(\_STSCONNECTURL, IOTHUB, DEVICEID);

HTTPCLIENTHANDLER HANDLER = NEW HTTPCLIENTHANDLER();

HTTPCLIENT = NEW HTTPCLIENT(HANDLER);

TRY

{

VAR APIRESPONSE = HTTPCLIENT.GETASYNC(URL).RESULT;

IF (APIRESPONSE.ISSUCCESSSTATUSCODE)

{

RESULT = APIRESPONSE.CONTENT.READASSTRINGASYNC().RESULT;

}

ELSE

{

THROW NEW HTTPREQUESTEXCEPTION();

}

}

CATCH (HTTPREQUESTEXCEPTION)

{

RESULT = NULL;

}

RETURN TASK.FROMRESULT(RESULT);

}

}

.NET için Azure IoT Hub cihaz SDK 'Sı için SAS belirteci kimlik doğrulama uygulama Özeti:

  1. Belirteç yenileme işlevini uygulayan DeviceAuthenticationWithTokenRefresh soyut sınıfına dayalı somut bir sınıf uygulayın.

  2. Aktarım bağlantı durumunu yakalamak ve aktarım uygulaması tarafından oluşturulan özel durumları önlemek için bir ConnectionStatusChangesHandler uygulayın.

Başvur

Java için Azure IoT Hub cihaz SDK 'Sı

Java için Azure IoT Istemci SDK 'sı, Sastokenprovider arabirimiaracılığıyla SAS belirteci ömür yönetimi desteğini uygular. SAS belirteci yenileme işlevselliğiyle bu arabirimi uygulayan bir sınıf, bir DeviceClient oluşturucusunda SecurityProvider olarak kullanılabilir. Taşıma uygulamaları, belirteci güvenlik sağlayıcısı aracılığıyla gerektiği şekilde otomatik olarak yenileyecek. Bağlantı değişikliklerini yakalamak ve aktarımlar tarafından oluşturulan özel durumları engellemek için bir ConnectionStatusChangeCallback kaydedilmelidir.

SasTokenProvider arabirimini uygulayan güvenlik sağlayıcısının örnek uygulaması:

IMPORT JAVA.IO.IOEXCEPTION;

IMPORT JAVA.NET.URI;

IMPORT JAVA.NET.HTTP.HTTPCLIENT;

IMPORT JAVA.NET.HTTP.HTTPREQUEST;

IMPORT JAVA.NET.HTTP.HTTPRESPONSE;

IMPORT JAVA.TIME.DURATION;

PUBLIC CLASS STSSECURITYPROVIDER IMPLEMENTS SASTOKENPROVIDER {

PRIVATE FINAL STRING HOSTNAME;

PRIVATE FINAL STRING DEVICEID;

PRIVATE INT RENEWALBUFFERSECONDS;

PRIVATE LONG EXPIRYTIMESECONDS;

PRIVATE CHAR[] SASTOKEN;

PUBLIC STSSECURITYPROVIDER(STRING HOSTNAME, STRING DEVICEID)

{

THIS.HOSTNAME = HOSTNAME;

THIS.DEVICEID = DEVICEID;

THIS.RENEWALBUFFERSECONDS = 120;

THIS.EXPIRYTIMESECONDS = (SYSTEM.CURRENTTIMEMILLIS() / 1000);

}

\@OVERRIDE

PUBLIC CHAR[] GETSASTOKEN() {

LONG CURRENTTIMESECONDS = (SYSTEM.CURRENTTIMEMILLIS() / 1000);

TRY {

IF (THIS.SASTOKEN == NULL \|\| THIS.EXPIRYTIMESECONDS +
THIS.RENEWALBUFFERSECONDS \>= CURRENTTIMESECONDS) {

THIS.SASTOKEN = STSGETTOKEN();

ASSERT THIS.SASTOKEN != NULL;

STRING T = STRING.COPYVALUEOF(THIS.SASTOKEN);

STRING[] BITS = T.SPLIT("SE=");

LONG L = LONG.PARSELONG(BITS[1]);

THIS.EXPIRYTIMESECONDS = L; // THE SE= NUMBER

THIS.RENEWALBUFFERSECONDS = (INT) (L \* 0.15); // RENEW WITHIN 15% OF EXPIRY

}

} CATCH (INTERRUPTEDEXCEPTION \| IOEXCEPTION E) {

E.PRINTSTACKTRACE();

}

RETURN THIS.SASTOKEN;

}

PRIVATE CHAR[] STSGETTOKEN() THROWS IOEXCEPTION, INTERRUPTEDEXCEPTION {

STRING STSURL =
STRING.FORMAT("HTTP://LOCALHOST:8080/STS/AZURE/TOKEN/OPERATIONS?SR=%S/DEVICES/%S",
THIS.HOSTNAME, THIS.DEVICEID);

HTTPREQUEST REQUEST = HTTPREQUEST.NEWBUILDER()

.URI(URI.CREATE(STSURL))

.TIMEOUT(DURATION.OFMINUTES(2))

.HEADER("CONTENT-TYPE", "APPLICATION/JSON")

.BUILD();

HTTPCLIENT CLIENT = HTTPCLIENT.NEWBUILDER()

.VERSION(HTTPCLIENT.VERSION.HTTP\_1\_1)

.CONNECTTIMEOUT(DURATION.OFSECONDS(20))

.BUILD();

HTTPRESPONSE\<STRING\> RESPONSE = CLIENT.SEND(REQUEST,
HTTPRESPONSE.BODYHANDLERS.OFSTRING());

IF(RESPONSE.STATUSCODE() \<200 \|\| RESPONSE.STATUSCODE()\>=300) {

RETURN NULL;

}

IF(RESPONSE.BODY().ISEMPTY()) {

RETURN NULL;

}

RETURN RESPONSE.BODY().TOCHARARRAY();

}

}

Java için Azure IoT Hub cihaz SDK 'Sı için SAS belirteci kimlik doğrulama uygulama Özeti:

  1. Bir sınıfa SasTokenProvider arabirimini uygulayın ve belirteç yenileme işlevini ekleyin.

  2. Aktarım bağlantısı durum değişikliklerini yakalamak ve taşıma uygulaması tarafından oluşturulan özel durumları önlemek için bir ConnectionStatusChangeCallback işleyicisi uygulayın.

Başvur

Python için Azure IoT Hub cihaz SDK 'Sı

Python için Azure IoT Hub cihaz SDK 'sı, ıothubdeviceclient nesnesindeki yöntemler aracılığıyla SAS belirteci desteği uygular. Bu yöntemler, bir belirteç kullanarak bir cihaz istemcisinin oluşturulmasını ve cihaz istemcisi oluşturulduktan sonra güncelleştirilmiş bir belirteç sağlayabilmesini sağlar. Belirteç ömrü yönetimi uygulamaz, ancak bu, zaman uyumsuz bir işlem olarak kolayca uygulanabilir.

Yalnızca işlevlerin ana hattını gösteren bir Python 3,7 örnek uygulama:

ASYNC DEF MAIN():

\# GET A SASTOKEN YOU GENERATED

SASTOKEN = GET\_NEW\_SASTOKEN()

\# THE CLIENT OBJECT IS USED TO INTERACT WITH YOUR AZURE IOT HUB.

DEVICE\_CLIENT = IOTHUBDEVICECLIENT.CREATE\_FROM\_SASTOKEN(SASTOKEN)

\# CONNECT THE CLIENT.

AWAIT DEVICE\_CLIENT.CONNECT()

\# DEFINE BEHAVIOR FOR PROVIDING NEW SASTOKENS TO PREVENT EXPIRY

ASYNC DEF SASTOKEN\_KEEPALIVE():

WHILE TRUE:

AWAIT ASYNCIO.SLEEP(NEW\_TOKEN\_INTERVAL)

SASTOKEN = GET\_NEW\_SASTOKEN()

AWAIT DEVICE\_CLIENT.UPDATE\_SASTOKEN(SASTOKEN)

\# ALSO RUN THE SASTOKEN KEEPALIVE IN THE EVENT LOOP

KEEPALIVE\_TASK = ASYNCIO.CREATE\_TASK(SASTOKEN\_KEEPALIVE())

\# CANCEL THE SASTOKEN UPDATE TASK

KEEPALIVE\_TASK.CANCEL()

\# FINALLY, SHUT DOWN THE CLIENT

AWAIT DEVICE\_CLIENT.SHUTDOWN()

IF \_\_NAME\_\_ == "\_\_MAIN\_\_":

ASYNCIO.RUN(MAIN())

Python SAS belirteci kimlik doğrulaması için Azure IoT Hub cihaz SDK 'Sı Özeti:

  1. SAS belirteci oluşturma işlevi oluştur.

  2. IoTHubDeviceClient.create_from_sastoken kullanarak bir cihaz istemcisi oluşturun.

  3. Belirteç ömrünü ayrı bir etkinlik olarak yönetin ve IoTHubDeviceClient.update_sastoken yöntemi için gerektiğinde, yenilenmiş bir belirteç ile cihaz istemcisine sahip yapın.

Başvur

Node.JS/JavaScript için Azure IoT Hub cihaz SDK 'Sı

Node.JS/JavaScript için Azure IoT, cihaz istemcisine bir SAS belirteci sunan Sharedaccesstiftureauthenticationprovider 'ı uygular ve IoT Hub kimlik doğrulaması yapmak için taşıma işlemleri yapar. Belirteç yenileme işlevselliği uygulamaz. Cihaz uygulamasının belirteç ömrünü yönetmesi ve belirteci gerektiği şekilde yenilemeleri gerekir.

IoT Hub ile bir bağlantı başlatmak için fromSharedAccessSignature ve updateSharedAccessSignature cihaz istemci yöntemlerini kullanın ve Sharedaccessimzatuteauthenticationprovider için yenilenmiş bir belirteç sağlayın ve bu, kimlik doğrulama sağlayıcısının aktarımlara newTokenAvailable olayını yaymasına neden olur.

simple_sample_device_with_sas.js örneğinde temel bir SAS belirteci örneği verilmiştir.

/JavaScript Azure IoT Hub cihaz SDK'Node.JSözeti

  1. SAS belirteci yaşam süresi yönetimini ve yenilemeyi uygulama.

  2. Bir cihaz istemci örneği oluşturmak içinSharedAccessSignature'dan cihaz istemcisini kullanın.

  3. Yenilenen bir belirteç sağlamak için cihaz istemci güncelleştirmesiSharedAccessSignature kullanın.

Başvuru:

Sonraki adımlar