什么是OIDC?
OpenID Connect(OIDC)是OAuth 2.0协议之上的一个简单身份层。它允许客户根据授权服务器执行的认证来验证最终用户的身份,并以可互操作和类似REST的方式获得最终用户的基本资料信息。
当客户想要访问来自外部系统的安全资源时,OIDC可以作为一种技术来验证客户应用程序用户访问这些外部系统。在这种情况下,SAP商务平台可以被配置为身份提供者。
继续阅读,了解各种认证和授权机制的好处、替代方案、区别,以及如何将SAP商务平台配置为开放ID Connect提供商的步骤。
OIDC的优势。
- OIDC使用id_token,它通过增加用户签到交易提供了额外的安全层。
- Nonce,由客户端发送,使响应的完整性得到验证
- 访问令牌的哈希值
- 代码的哈希值(可选)
- OIDC包含认证信息
- 它使用JSON网络签名(JWS)进行签名
- 它可以使用JSON Web加密(JWE)进行加密。
OIDC的替代品。
作为OIDC的替代品,应用程序可以选择OAuth 2.0或SAML来达到类似的目的。OIDC建立在OAuth 2.0之上,与OAuth一起提供基于API的额外信息,涉及到系统上发生的任何认证和授权。
OIDC和OAuth2.0之间的区别。
| OAuth 2.0 | OIDC |
| OAuth 2.0被设计为一个授权框架,而不是一个认证协议。在许多很酷的任务中,OAuth 2.0可以用来进行人员认证 | 属性发布和认证是OpenID Connect专门设计的主要内容。 |
| 在OAuth 2.0中没有定义id_token,因为它是专门用于联合认证的 | OIDC使用id_token |
| OAuth 2.0是通用的,所以它可以应用于许多授权要求,如API访问管理,在某人的墙上发帖,以及使用物联网服务。 | OpenID Connect主要关注于用户认证 |
SAML和OIDC之间的区别。
| SAML | OIDC |
| 在SAML中,用户从服务提供商(SP)到身份提供商(IDP)的重定向是为了签入。 | 用户从信赖方(RP)重定向到OpenID提供商(OP)进行签到是在OIDS中进行的。 |
| SAML服务提供商将始终是一个网站。 | 在OCID中,RP(信赖方)可以是一个网站或一个移动应用程序,被称为 "客户端",因为它扩展了OAuth 2.0客户端。 |
| 存在一个由签名的XML文档组成的 "断言",其中包括主题信息(认证机构)、属性(人的详细信息)、签发者和其他关于认证事件的信息。 | Id Token在OpenID Connect中是等同的。OCID使用一个签名的JSON文档,其中包含发布者、主体和认证信息。 |
OIDC架构

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。
重定向的 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之间做出选择
- 对于移动应用程序 - 我们应该使用 OIDC
- 如果应用程序已经支持SAML,请使用SAML
- 如果编写一个新的应用程序,使用OIDC
- 如果需要保护API或者需要创建API网关,则使用OAuth 2.0
我希望这篇博文能帮助你了解OIDC以及如何实现它。
虽然很多博客没有关于OIDC的内容,但在SAP帮助门户中可以找到更多关于OIDC的信息。
你还需要其他的信息,也应该添加到博客中吗?请在本博文的评论中告诉我们。请喜欢并在评论区分享反馈或想法。