前端笔记

分享前端开发思考与感悟

自定义不透明访问令牌生成

嗨👋

问候大家😊…
这是步行🏊🏼游泳another的另一种媒介,当我们确实有需求问题时,可以通过使用API​​M令牌发行者来自定义不透明的访问令牌

使用WSO2 API Manager v2.6演示并逐步演示了该演示

哇啊?等等…为什么?🤔

您现在可能有一个问题,关于我们为什么需要这样做以及实际上有什么关系……让我给您一个简单的愚蠢的场合,告诉您我真正需要何时何地。

RepoDeWS是一个开发人员管理系统,在SOAP中具有一组内置管理服务。在WSO2 API管理器的帮助下,这些SOAP服务作为REST API公开。现在,RepoDeWS团队正在进行安全维护,他们期望其用户使用附加了“ Dev-Hash ”值的访问令牌来调用API 。

请求访问令牌时,此“ Dev-Hash”值将作为标头(devhash)传递,并将在生成不透明的访问令牌时附加

哦……我忘了提到Dev-Hash值是给一组顶级开发人员的唯一哈希值,以利用上次访问的时间戳丰富其API响应😅

让我们只关注实现和增强,并将我们的用例放在后面。

实作

为了满足我的简单要求,我们必须扩展APIMTokenIssuer的实现并推广我们的增强功能。

APIMTokenIssuer负责在WSO2 API Manager平台产生不透明的访问令牌和智威汤逊令牌

首先,创建一个简单的maven项目,并将以下依赖项添加到POM。这将有助于我们在扩展APIMTokenIssuer类时解决大多数依赖性问题。

<dependencies>
 <dependency>
  <groupId>org.wso2.carbon.apimgt</groupId>
  <artifactId>org.wso2.carbon.apimgt.keymgt</artifactId>
  <version>6.5.222</version>
 </dependency>
</dependencies>

但是,如果遇到任何依赖关系问题,或者无法解决POM中的依赖关系,则还应添加以下内容……

<repositories>
 <repository>
  <id>wso2-nexus</id>
  <url>http://maven.wso2.org/nexus/content/groups/wso2-public/</url>
  <releases>
   <enabled>true</enabled>
   <updatePolicy>daily</updatePolicy>
   <checksumPolicy>ignore</checksumPolicy>
  </releases>
 </repository>
</repositories>
<pluginRepositories>
 <pluginRepository>
  <id>wso2-nexus</id>
  <url>http://maven.wso2.org/nexus/content/groups/wso2-public/</url>
  <releases>
   <enabled>true</enabled>
   <updatePolicy>daily</updatePolicy>
   <checksumPolicy>ignore</checksumPolicy>
  </releases>
 </pluginRepository>
</pluginRepositories>

 😅
管理依赖更难比管理费用bruh😬😬😭…

现在让我们进入扩展实现。下面给出的是为解决我自己的问题而开发的代码(I)[我对over是否反应过度?我想我是😒]

package com.sample.token;
import org.wso2.carbon.apimgt.impl.APIConstants;
import org.wso2.carbon.apimgt.impl.utils.APIUtil;
import org.wso2.carbon.apimgt.keymgt.issuers.APIMTokenIssuer;
import org.wso2.carbon.identity.oauth2.token.OAuthTokenReqMessageContext;
import org.wso2.carbon.identity.oauth2.model.RequestParameter;
public class MyAPIMTokenIssuer extends APIMTokenIssuer {
  private static final Log log = LoggerFactory.getLog(MyAPIMTokenIssuer.class)
  @Override
  public String accessToken(OAuthTokenReqMessageContext tokReqMsgCtx) throws OAuthSystemException {
    // generate access token using super method
    String accessToken = super.accessToken(tokReqMsgCtx);
    String clientId = tokReqMsgCtx.getOauth2AccessTokenReqDTO().getClientId();
    Application application;
    try {
      application = APIUtil.getApplicationByClientId(clientId);
      String tokenType = application.getTokenType();
      // only acceptable for opaque access tokens and not JWT tokens
      if (!APIConstants.JWT.equals(tokenType)) {

        // retrieve all request parameters sent to the token request
        RequestParameter[] reqParams = tokReqMsgCtx.getOauth2AccessTokenreqDTO().getRequestParameters();
        for (int i = 0l i < reqParams.length; i++) {
          // check for devhash from the request parameters 
          // and append it to the access token
          if ("devhash".equals(reqParams[i].getKey())) {
            accessToken += reqParams[i].getValue()[0];
            break;
          }
        }
      }
    } catch (APIManagementException e) {
      log.error("Exception occured ", e);
    }

    return accessToken;
  }
}

我知道是对的,要跟进这些事情真的很困难😐
因此,我给您带来了千载难逢的机会……请去GitHub Gist上找到示例实现(gist)(节省您阅读此介质的时间)并享受丰富的知识😍

com.sample.token ;
导入 org.apache.oltu.oauth2.common.exception.OAuthSystemException ;
导入 org.wso2.carbon.apimgt.api.APIManagementException ;
导入 org.wso2.carbon.apimgt.api.model.Application ;
导入 org.wso2.carbon.apimgt.impl.APIConstants ;
导入 org.wso2.carbon.apimgt.impl.utils.APIUtil ;
导入 org.wso2.carbon.apimgt.keymgt.issuers.APIMTokenIssuer ;
导入 org.wso2.carbon.identity.oauth2.token.OAuthTokenReqMessageContext ;
导入 org.wso2.carbon.identity.oauth2.model.RequestParameter ;
导入 org.apache.commons.logging.Log ;
导入 org.apache.commons.logging.LogFactory ;
公共 MyAPIMTokenIssuer 扩展了 APIMTokenIssuer {
私有 静态 最终 Log log = LogFactory getLog(MyAPIMTokenIssuer 类);
@Override
公共 字符串 accessTokenOAuthTokenReqMessageContext tokReqMsgCtx引发 OAuthSystemException {
//使用超级方法生成访问令牌
字符串 accessToken = super accessToken(tokReqMsgCtx);
字符串 clientId = tokReqMsgCtx getOauth2AccessTokenReqDTO()getClientId();
应用程序;
尝试 {
application = APIUtil getApplicationByClientId(clientId);
字符串 tokenType = application getTokenType();
//仅适用于不透明的访问令牌,而不适用于JWT令牌
如果APIConstants JWT 等于(tokenType)){
//检索发送到令牌请求的所有请求参数
RequestParameter [] reqParams = tokReqMsgCtx getOauth2AccessTokenReqDTO()getRequestParameters();
INT= 0 ;我< reqParams 长度;我++){
//从请求参数中检查devhash参数,并将其附加到
//访问令牌
如果 devhash 等于(reqParams [I] 信息getKey())){
accessToken + = reqParams [i] getValue()[ 0 ];
休息 ;
}
}
}
} catchAPIManagementException e){
日志error(我的代码中发生异常,e);
}
返回 accessToken;
}
}
<?xml 版本 = 1.0 编码 = UTF-8 ?>
< project xmlns = http://maven.apache.org/POM/4.0.0
xmlns:xsi = http://www.w3.org/2001/XMLSchema-instance xsi schemaLocation = http://maven.apache.org/POM/4.0.0 http://maven.apache.org /xsd/maven-4.0.0.xsd >
< modelVersion > 4.0.0 </ modelVersion >
< groupId > com.sample.token </ groupId >
< artifactId >自定义令牌发行人</ artifactId >
< 版本 > 1.0.0 </ 版本 >
<!-将包装更改为捆绑(从jar打包)以支持OSGi- >
< 包装 >罐子</ 包装 >
< 属性 >
< project .build.sourceEncoding> UTF-8 </ project .build.sourceEncoding>
< maven .compiler.source> 1.8 </ maven .compiler.source>
< maven .compiler.target> 1.8 </ maven .compiler.target>
</ 属性 >
< 依赖项 >
< 依存关系 >
< groupId > org.wso2.carbon.apimgt </ groupId >
< artifactId > org.wso2.carbon.apimgt.keymgt </ artifactId >
< 版本 > 6.5.222 </ 版本 >
</ 依赖 >
</ 依赖 >
< 存储库 >
< 存储库 >
< id > wso2-nexus </ id >
< url > http://maven.wso2.org/nexus/content/groups/wso2-public/ </ url >
< 版本 >
< enabled > true </ enabled >
< updatePolicy >每日</ updatePolicy >
< checksumPolicy >忽略</ checksumPolicy >
</ 版本 >
</ 资料库 >
</ 储存库 >
< pluginRepositories >
< pluginRepository >
< id > wso2-nexus </ id >
< url > http://maven.wso2.org/nexus/content/groups/wso2-public/ </ url >
< 版本 >
< enabled > true </ enabled >
< updatePolicy >每日</ updatePolicy >
< checksumPolicy >忽略</ checksumPolicy >
</ 版本 >
</ pluginRepository >
</ pluginRepositories >
< 构建 >
< 插件 >
< 插件 >
< groupId > org.apache.maven.plugins </ groupId >
< artifactId > maven-compiler-plugin </ artifactId >
< 版本 > 2.0 </ 版本 >
< 配置 >
< source > 1.8 </ source >
< 目标 > 1.8 </ 目标 >
</ 配置 >
</ 插件 >
<!-支持OSGi Bundle的构建插件->
< 插件 >
< groupId > org.apache.felix </ groupId >
< artifactId > maven-bundle-plugin </ artifactId >
< 版本 > 2.3.4 </ 版本 >
< extensions > true </ extensions >
< 配置 >
< 说明 >
< Bundle-SymbolicName > com.sample.token </ Bundle-SymbolicName >
< Bundle-Name > com.sample.token </ Bundle-Name >
< 出口包装 >
com.sample.token。*,
</ 出口包装 >
< 进口包装 >
*; 分辨率:=可选
</ Import-Package >
</ 说明 >
</ 配置 >
</ 插件 >
</ 插件 >
</ build >
</ project >

你内心的声音:嗯…谢谢你。我浏览了样本并从给定的来源复制了所有内容。现在,我下一步该怎么做?我应该把这些实现放在哪里???

我:嗯…我想我听到了你内心的声音。但谢谢你的问题。

《自定义不透明访问令牌生成》

在接下来的步骤中,我们必须通过从终端执行以下命令来构建Maven项目

mvn clean package

然后将构建的JAR工件从target文件夹复制并放置到<APIM>/repository/components/lib目录中。

最后[哇…。(神奇关键字🤗😍],MyAPIMTokenIssuer通过编辑中的<IdentityOAuthTokenGenerator>属性,将APIMTokenIssuer类表示形式更改为该类<APIM>/repository/conf/identity/identity.xml

<IdentityOAuthTokenGenerator>com.sample.token.MyAPIMTokenIssuer</IdentityOAuthTokenGenerator>

《自定义不透明访问令牌生成》

🎉瞧!!!🎉

让我们用我们的代码进行测试运行…

继续堆叠!!!

试驾

使用工件和上述配置更改启动WSO2 API Manager服务器。

执行以下CURL命令以生成不透明访问令牌,并验证它是否已使用指定的Dev-Hash值生成…

curl --location --request POST 'https://localhost:8243/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic {Base64<ClientID>:<ClientSecret>} \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=admin' \
--data-urlencode 'password=admin' \
--data-urlencode 'scope=default' \
--data-urlencode 'devhash=af1c4ca13ab7d6c8d2a887d7ce8250a2'

响应应该如下所示,将Dev-Hash值附加到访问令牌中

{
  "access_token": "25b9ded7-7441-3b69-bb6b-b1f1828bfff9af1c4ca13ab7d6c8d2a887d7ce8250a2",
  "refresh_token": "d86ac9b8-a3aa-3664-9d39-090ca49a9435",
  "scope": "default",
  "token_type": "Bearer",
  "expires_in": 3600
} 

《自定义不透明访问令牌生成》 athiththan11 Sample-APIMTokenIssuer

一个简单的自定义APIM令牌发行者实现

自定义APIM令牌发行者

一个扩展的示例APIMTokenIssuer实现,将自定义值附加到生成的不透明访问令牌中。

中等博客:自定义不透明访问令牌生成

实作

这是一个示例实现,以演示如何提取与Token请求一起发送的自定义标头并将其附加到生成的Opaque访问令牌上。

此处使用的自定义标头称为devhashdata-urlencodeToken请求一样是哈希值。

下面给出的是一个样品/tokenrequst

POST https:// localhost:8243 / token
 授权:基本<Base64 {Client ID}:{Client Secret}> 
内容类型: application / x-www-form-urlencoded 
grant_type = 密码 
用户名= admin 
密码= admin 
范围= defualt 
devhash = af1c4ca13ab7d6c8d2a887d7ce8250a2
curl --location --request POST 'https://localhost:8243/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --header 'Authorization: Basic <Base64 {Client ID}:{Client Secret}> \
    --data-urlencode 'grant_type=password' \
    --data-urlencode 'username=admin' \
    --data-urlencode 'password=admin' \
    --data-urlencode 'scope=default' \
    --data-urlencode 'devhash=af1c4ca13ab7d6c8d2a887d7ce8250a2'

响应应该如下…

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注