Modèles d'intégration des robots de conversation

Integrate 3rd party AI Chat Bots with IBM Security Verify

Introduction

Les chatbots élargissent le moyen d'interaction avec les consommateurs. Dans le contexte de la gestion des identités et des accès des consommateurs (CIAM), les marques peuvent interagir avec les consommateurs de manière logique et automatisée, tout en garantissant la confiance et en offrant une expérience transparente. L'intégration des robots de conversation à l'IAM est un domaine où de nouveaux modèles d'interaction peuvent être mis en place.

IBM Verify peuvent être autorisés à utiliser des robots de conversation pour relever les défis en matière de sécurité afin d'établir et de maintenir la confiance par le biais d'interactions avec les robots de conversation.

Le document suivant décrit les étapes de la configuration d'un Chat Bot IA pour IBM Verify. Ce document précise comment utiliser Watson Assistant avec IBM Verify. IBM Verify peut s'étendre et s'intégrer à d'autres chatbots si nécessaire.

Prérequis

Pour commencer avec les intégrations IBM Verify avec Watson Assistant, les pré-requis suivants sont nécessaires pour cette intégration de chat bot. D'autres intégrations de chat bot sont possibles avec IBM Verify.

Les développeurs doivent être familiarisés avec les chatbots, IBM Verify et les appels d'API REST.

Créer une fonction IBM Cloud

1768

Étapes de la création d'une fonction IBM Cloud

  1. Cliquez sur Démarrer la création
  2. Choisissez " Action " dans la catégorie Droits uniques
  3. Donnez un nom à votre action
  4. Il servira de référence ultérieurement.
  5. Choisissez votre langage d' exécution
936
  1. Dans la page de code, copiez ce code. Veillez à modifier le tenantid, le clientid et le clientsecret. Ajoutez des méthodes supplémentaires et des appels au repos si nécessaire.
#
#
# main() will be run when you invoke this action
#
# @param Cloud Functions actions accept a single parameter, which must be a JSON object.
#
# @return The output of this action, which must be a JSON object.
#
#
import sys
import os
import requests
import json
import base64
import random
from flask import Flask, request, jsonify

tentantid="https://mytenatn.ice.ibmcloud.com"
clientid="46e458c7-33f4-XXXXXX"
clientsecret="abcdef"

def main(dict):
    action = dict.get("action")
    if action == "lookup": username = dict.get("userName")
        response=accountlookup(username)
        return response
    if action == "email": otpmethod = dict.get("method")
        target = dict.get('target')
        response=initiate_email(method=otpmethod, target=target)
        return response
    if action == "sms": otpmethod = dict.get("method")
        target = dict.get('target')
        response=initiate_sms(method=otpmethod, target=target)
        return response
    if action == "verify": txnid = dict.get('txnid')
        method = dict.get('method')
        otp = dict.get('otp')
        response=verify(txnid=txnid, method=method, otp=otp)
        return response
    if action == "reset": userid = dict.get('userid')
        response = pwreset(userid)
        return response
    if action == "showotp": userid = dict.get('userid')
        response = showotp(userid)
    response = {'message': "Sorry, I didn't understand"}
    return response
def auth():
    url = tentantid + ":443/v1.0/endpoint/default/token"
    payload = "grant_type=client_credentials&client_id=" + clientid + "&client_secret=" + clientsecret + "&scope=openid"
    headers = {
        'Content-Type': "application/x-www-form-urlencoded"
        }
    response = requests.request("POST", url, data=payload, headers=headers)
    return response.json()["access_token"]
def showotp():
    access_token = auth()
    url = tentantid + "/v2.0/factors/otp"
    payload = "{\r\n  \"correlation\": \"1234\"}"
    headers = {
        'Authorization': "Bearer "+access_token,
        'Content-Type': "application/json"
        }
    response = requests.request("POST", url, data=payload, headers=headers)
    if response.status_code == 202:
        resp = {
                    "txnid": response.json()["id"],
                    "correlation": response.json()["correlation"],
                    "otp": response.json()["otp"],
                    'status_code': 200
                }
    else:
        resp = {
                'messages': "Nope.. that didnt work.",
                'status_code': 400        
        }
    return resp
def initiate_email(method, target):
    access_token = auth()
    url = tentantid + "/v1.0/authnmethods/" + method + "/transient/verification"
    payload = "{\r\n  \"correlation\": \"1234\",\r\n  \"otpDeliveryEmailAddress\": \""+target+"\"\r\n}"
    headers = {
        'Authorization': "Bearer "+access_token,
        'Content-Type': "application/json"
        }
    response = requests.request("POST", url, data=payload, headers=headers)
    if response.status_code == 202:
        resp = {
                    "txnid": response.json()["id"],
                    "correlation": response.json()["correlation"],
                    'status_code': 200
                }
    else:
        resp = {
                'messages': "Nope.. that didnt work.",
                'status_code': 400        
        }
    return resp
def initiate_sms(method, target):
    access_token = auth()
    url = tentantid + "/v1.0/authnmethods/" + method + "/transient/verification"
    payload = "{\r\n  \"correlation\": \"1234\",\r\n  \"otpDeliveryMobileNumber\": \""+target+"\"\r\n}"
    headers = {
        'Authorization': "Bearer "+access_token,
        'Content-Type': "application/json"
        }
    response = requests.request("POST", url, data=payload, headers=headers)
    if response.status_code == 202:
        resp = {
                "txnid": response.json()["id"],
                "correlation": response.json()["correlation"],
                'status_code': 200
        }
    else:
        resp = {
                'messages': "Nope.. that didnt work.",
                'status_code': 400
        }
    return resp
def accountlookup(userName):
    access_token = auth()
    url = tentantid + "/v2.0/Users?filter=userName eq \"" + userName + "\""
    payload = ""
    headers = {
        'Authorization': "Bearer "+access_token,
        }
    response = requests.request("GET", url, data=payload, headers=headers)
    print(response.text)
    if response.status_code == 200:
        if response.json()["totalResults"] != 0:
            resp={
                    'message': "I found your account.",
                    'user_email': response.json()["Resources"][0]["emails"][0]["value"],
                    'user_id': response.json()["Resources"][0]["id"],
                    'cell_phone': response.json()["Resources"][0]["phoneNumbers"][0]["value"],
                    'status_code': 200
            }
        else:
            resp = {'messages': "I'm sorry, I can't find that account. Can you try again?",
                    'status_code': 400                    
            }
    else:
        resp = {'messages': "Oops... that didnt work.",
                'status_code': 400
        }
    return resp
def verify(txnid, method, otp):
    access_token = auth()
    url = tentantid + "/v1.0/authnmethods/" + method + "/transient/verification/" + txnid
    print("URL "+url)
    payload = "{\r\n  \"otp\": \"" + otp + "\"\r\n}"
    print(payload)
    headers = {
        'Authorization': "Bearer "+access_token,
        'Content-Type': "application/json"
        }
    response = requests.request("POST", url, data=payload, headers=headers)
    print(response.text)
    if response.status_code == 200:
        resp = {
                    "bbb_verified": "true",
                    'messages':"Perfect, the code was successful. We're good to go!",
                    'status_code': 200
                }
    else:
        resp = {'messages': "Nope.. that didnt work.",
                'status_code': 400}
    return resp
def pwreset(userid):
    access_token = auth()
    url = tentantid + "/v2.0/Users/" + userid + "/passwordResetter"
    print("URL "+url)
    payload = """{
        "schemas": [
            "urn:ietf:params:scim:api:messages:2.0:PatchOp"
        ],
        "operations": [
            {
                "op": "replace",
                "value": {
                    "password": "auto-generate",
                    "urn:ietf:params:scim:schemas:extension:ibm:2.0:Notification": {
                        "notifyType": "EMAIL",
                        "notifyPassword": true,
                        "notifyManager": false
                    }
                }
            }
        ]
    }"""
    headers = {
        'Authorization': "Bearer "+access_token,
        'Content-Type': "application/scim+json"
        }
    response = requests.request("PATCH", url, data=payload, headers=headers)
    print(response.text)
    if response.status_code == 204:
        resp = {
                    'messages': "Your password has been reset successfully. Please check your email for the new password.",
                    'status_code': 200    
                }
    else:
        resp = {
                    'messages': "The password reset operation failed. Please try again.",
                    'status_code': 400
                }
    return resp
  1. Allez sur Endpoint et récupérez le site URL. Cette adresse url est nécessaire pour l'étape suivante.

Créer la configuration de Watson Assistant

  1. Commencez par lancer l'application Watson Assistant
  2. Accédez à la page de l'outil Watson Assistant (spécifique à votre compte)
  3. Créer un nouvel assistant (ou utiliser "Mon premier assistant")
  4. Sélectionnez "Ajouter une compétence de dialogue"

  1. "Créer une compétence

  1. Sélectionnez Options et entrez les webhooks. C'est ici que vous devez coller l'url de l'étape précédente, assurez-vous d'ajouter.json à la fin

  1. Dans la section de dialogue, créez les nœuds et les flux nécessaires.

  1. Un nœud (compte de consultation) utilise le crochet Web en transmettant une action et les données requises :

  1. Une fois que vous avez défini le flux, utilisez la prévisualisation pour le tester :
361 366
  1. Retournez à l'onglet principal de votre assistant et sélectionnez "Ajouter des intégrations"
452
  1. Sélectionnez l'onglet intégré et copiez le code html pour l'étape suivante.
967

IBM Verify Configuration

Intégrer le code html de l'étape précédente dans toutes les pages personnalisées de IBM Verify si nécessaire. Cela peut se faire sur la page de connexion, les pages d'erreur, le mot de passe oublié, etc. Pour plus d'informations sur l'image de marque, voir le document sur l'image de marque et la personnalisation.

💎

Diana Jorgenson, IBM Sécurité

Martin Schmidt, IBM Sécurité