将SAP Hybris设置为OpenID连接身份提供者

155 阅读5分钟

什么是OIDC?

OpenID Connect(OIDC)是OAuth 2.0协议之上的一个简单身份层。它允许客户根据授权服务器执行的认证来验证最终用户的身份,并以可互操作和类似REST的方式获得最终用户的基本资料信息。

当客户想要访问来自外部系统的安全资源时,OIDC可以作为一种技术来验证客户应用程序用户访问这些外部系统。在这种情况下,SAP商务平台可以被配置为身份提供者。

继续阅读,了解各种认证和授权机制的好处、替代方案、区别,以及如何将SAP商务平台配置为开放ID Connect提供商的步骤。

OIDC的优势。

  1. OIDC使用id_token,它通过增加用户签到交易提供了额外的安全层。
  2. Nonce,由客户端发送,使响应的完整性得到验证
  3. 访问令牌的哈希值
  4. 代码的哈希值(可选)
  5. OIDC包含认证信息
  6. 它使用JSON网络签名(JWS)进行签名
  7. 它可以使用JSON Web加密(JWE)进行加密。

OIDC的替代品。

作为OIDC的替代品,应用程序可以选择OAuth 2.0或SAML来达到类似的目的。OIDC建立在OAuth 2.0之上,与OAuth一起提供基于API的额外信息,涉及到系统上发生的任何认证和授权。

OIDC和OAuth2.0之间的区别。

OAuth 2.0OIDC
OAuth 2.0被设计为一个授权框架,而不是一个认证协议。在许多很酷的任务中,OAuth 2.0可以用来进行人员认证属性发布和认证是OpenID Connect专门设计的主要内容。
在OAuth 2.0中没有定义id_token,因为它是专门用于联合认证的OIDC使用id_token
OAuth 2.0是通用的,所以它可以应用于许多授权要求,如API访问管理,在某人的墙上发帖,以及使用物联网服务。OpenID Connect主要关注于用户认证

SAML和OIDC之间的区别。

SAMLOIDC
在SAML中,用户从服务提供商(SP)到身份提供商(IDP)的重定向是为了签入。用户从信赖方(RP)重定向到OpenID提供商(OP)进行签到是在OIDS中进行的。
SAML服务提供商将始终是一个网站。在OCID中,RP(信赖方)可以是一个网站或一个移动应用程序,被称为 "客户端",因为它扩展了OAuth 2.0客户端。
存在一个由签名的XML文档组成的 "断言",其中包括主题信息(认证机构)、属性(人的详细信息)、签发者和其他关于认证事件的信息。Id Token在OpenID Connect中是等同的。OCID使用一个签名的JSON文档,其中包含发布者、主体和认证信息。

OIDC架构

OIDC%20Architecture

OIDC架构

将平台配置为一个ID供应商

由于OCID是基于OAuth 2.0授权框架的。因此,首先,我们需要配置OAuth客户端的角色。

配置impex的OpenID客户端细节

INSERT_UPDATE OpenIDClientDetails;clientId[unique=true];resourceIds;scope;authorizedGrantTypes;authorities;clientSecret;registeredRedirectUri;externalScopeClaimName;issuer;client-side;hybris;basic,email,profile,openid;implicit,client_credential,passwrd;ROLLE_CLIENT;secret;http://MYAPPLICATION/ ,google.com/some\_addre…; scope; ec

配置外部系统作用域。

insert_update OpenIDExternalScopes;code[unique=true];clientDetailsId(clientId)[allownull=true,forceWrite=true];permittedPrincipals(uid);范围;编辑器;客户端;hac_platform_configuration;hybris.tenant=ecopenid,hybris.product_create,hybris.product_update,hybris。product_delete,hybris.product_read_unpublished;reader;client-side;hac_platform_license;hybris.tenant=ecopenid,hybris.product_read_unpublished;admin ;client-side;hac_editor;hybris.product_delete_all,hybris.product_read_unpublished

生成 KeyStore。

要在Hybris中使用OCID,需要有一个Java KeyStore repo,其中包括公钥和私钥。我们可以使用Java keytool生成一个新的Keystore,因为平台中的演示Keystore仅用于开发目的。RSA是最受欢迎的加密算法。

下面的命令可以用来生成KeyStore。

keytool -genkey -keyalg RSA -alias alias -keystore keystore.jks -keysize 2048

外部系统OCID提供者的配置细节。

以下内容可用于从外部提供者请求id_token。

GET https://EC\_IDP\_URL/authorize/?response\_type=id\_token token &client_id=EXTERNAL_CLIENT_ID&redirect_uri=REDIRECT_URI_TO_WEB_PAGE &scope=SCOPE &nonce=NONCE &state=WEB_STATE

它应该将你重定向到外部页面,最后重定向到原始页面。id_token应该在网页的URL中。

id_token值存在于重定向的URL中。

http://MY\_APPLICATION/ #access_token=cfc4af6d-b38b-4152-a923-9af8de6c7f33%26token_type=bearer%26state=3%26expires_in=39321%26id_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRlc3QxIn0.eyJzdWIiOiJlZGl0b3IiLCJzY29wZSI6WyJvcGVuaWQiLCJoeWJyaXMucHJvZHVjdF9jcmVhdGUiLCJoeWJyaXMucHJvZHVjdF91cGRhdGUiLCJoeWJyaXMucHJvZHVjdF9kZWxldGUiLCJoeWJyaXMucHJvZHVjdF9yZWFkX3VucHVibGlzaGVkIiwiaHlicmlzLnByb2R1Y3RfZGVsZXRlX2FsbCJdLCJpc3MiOiJlYyIsInN0YXRlIjoiMyIsImV4cCI6MTUwMTg1MzYzNiwibm9uY2UiOiI1IiwiaWF0IjoxNTAxODUwMDM2fQ.HZ3ZZe4p3AkqZupijTiyTC_5BDQi6ZDT3kQusVlWHt0Db7qSbF1ZA9X2IcheLiJfGTiv9iAFR3CV-R8mqgfurdDKIZyJhMFad77O9ghhJpuzSfPJa9UVheOWoryXHiVLTyARu_Z9VmouokAan_bX0UXe7eOckNv28u3gL3wTGsY"

编码形式的Id_token看起来像这样。

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRlc3QxIn0。eyJzdWIiOiJlZGl0b3IiLCJzY29wZSI6WyJvcGVuaWQiLCJoeWJyaXMucHJvZHVjdF9jcmVhdGUiLCJoeWJyaXMucHJvZHVjdF91cGRhdGUiLCJoeWJyaXMucHJvZHVjdF9kZWxldGUiLCJoeWJyaXMucHJvZHVjdF9yZWFkX3VucHVibGlzaGVkIiwiaHlicmlzLnByb2R1Y3RfZGVsZXRlX2FsbCJdLCJpc3MiOiJlYyIsInN0YXRlIjoiMyIsImV4cCI6MTUwMTg1MzYzNiwibm9uY2UiOiI1IiwiaWF0IjoxNTAxODUwMDM2fQ.HZ3ZZe4p3AkqZupijTiyTC_5BDQi6ZDT3kQusVlWHt0Db7qSbF1ZA9X2IcheLiJfGTiv9iAFR3CV-R8mqgfurdDKIZyJhMFad77O9ghhJpuzSfPJa9UVheOWoryXHiVLTyARu_Z9VmouokAan_bX0UXe7eOckNv28u3gL3wTGSY

如果我们对id_token进行解码,它看起来像。

HEADER: ALGORITHM & TOKEN TYPE{ "alg": "RS256", "typ": "JWT", "kid": "test"}PAYLOAD:DATA{ "sub": "editor", "scope":["openid", "hybris.product_read_unpublished" ], "iss": "ec", "state": "3", "exp":45049757, "nonce": "3", "iat":41846157}

现在可以按以下方式交换访问令牌的id_token。

GET https://external\_system.io/oauth2/v1/authorize/? &client_id=EXTERNAL_SYSTEM_CLIENT_ID &hybris_id_provider=ID_PROVIDER_REGISTERED_IN_EXTERNAL_SYSTEM &id_token_hint=ID_TOKEN_FROM_EXTERNAL_PROVIDER &nonce=NONCE &redirect_uri=REDIRECT_URI_TO_WEB_PAGE &response_type=token &state=WEB_STATE

首先,它将把你重定向到外部系统OAuth,然后是平台(外部提供者),最后是原始页面。access_token应该出现在网页的URL中。

用id_token交换access_token。

GET https://external\_system.io/oauth2/v1/authorize/?client\_id=ZwXU5ktg3TEYdZnDjrf4SCZjycO9KYd4&id\_token\_hint=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRlc3QxIn0。eyJzdWIiOiJlZGl0b3IiLCJzY29wZSI6WyJvcGVuaWQiLCJoeWJyaXMucHJvZHVjdF9jcmVhdGUiLCJoeWJyaXMucHJvZHVjdF91cGRhdGUiLCJoeWJyaXMucHJvZHVjdF9kZWxldGUiLCJoeWJyaXMucHJvZHVjdF9yZWFkX3VucHVibGlzaGVkIiwiaHlicmlzLnByb2R1Y3RfZGVsZXRlX2FsbCJdLCJpc3MiOiJlYyIsInN0YXRlIjoiMyIsImV4cCI6MTUwMTg1MzU4NCwibm9uY2UiOiI1IiwiaWF0IjoxNTAxODQ5OTg0fQ.XVG6cKLhgSHoQet1XVgK9gi98pwsKXVqGIjwwMzaUzfZWV3sj33vILqK-ysmAhwIEWHqQpi56YvWHWbciucrcVY4bI7GswAM8vqJsjnokG0QnZ9BQgTzwd56yjgeST1PKfG9xsnJ7UkMPDOkhZPUyMCPUtk\_hxjYskSDXeapxM8&hybris\_id\_provider=6616d705-58ab-4641-abcb-69b307743cc7&redirect\_uri=http://localhost:8090&state=7&nonce=11&response\_type=token

重定向的 URL 包含这个 access_token 值。

http://MY\_APPLICATION/#token\_type=Bearer&access\_token=022-de34d0e4-0557-4c18-b8ef-7c8544e8d6b9&expires\_in=3600&scope=hybris.product\_create hybris.product_update hybris.product_delete hybris.product_read_unpublished hybris.product_delete_all&state=7

结论。

如何在OIDC/OAuth 2.0/SAML之间做出选择

  1. 对于移动应用程序 - 我们应该使用 OIDC
  2. 如果应用程序已经支持SAML,请使用SAML
  3. 如果编写一个新的应用程序,使用OIDC
  4. 如果需要保护API或者需要创建API网关,则使用OAuth 2.0

我希望这篇博文能帮助你了解OIDC以及如何实现它。

虽然很多博客没有关于OIDC的内容,但在SAP帮助门户中可以找到更多关于OIDC的信息。

你还需要其他的信息,也应该添加到博客中吗?请在本博文的评论中告诉我们。请喜欢并在评论区分享反馈或想法。

参考资料。

  1. openid.net/connect/
  2. help.sap.com/docs/SAP_CO…