オープンソースのアプレットログインモジュールコンポーネント(トークン)を作成する

最初にSSOを理解する

単純なサインオンの場合、2種類あります。1つはWeb上のCookieに基づくもので、もう1つはクロスエンドのトークンに基づくものです。一般的に、実行したいことは、トークンを優先することです。後の拡張も便利なので、個人的なアドバイスをしてください。

トークンにした方がよい小さなプログラムにも同じことが言えます。

フローチャート

画像の説明
PS:写真4のテキストが間違っています〜

1、启动服务
2、小程序初次加载app.js校验token,使用code去换取token
3、检测User信息是否存在code,不存在则注册新用户,最后返回对应用户Id
4、将随机Token与UserId一起存入Redis中
5、返回Token信息,小程序存于缓存中,作为api请求的认证凭证

このプロセスの考え方は、すべての背景言語に共通です。

具体的な実現

この記事の環境は主にSpringBoot用であるため、他のフレームワークと互換性がない場合があります。

コードで直接入手してください!

まず第一に、それがオープンソースである場合、特定のものを構成する必要があり、ハードコーディングできないことを確認する必要があります。次に、application.ymlのデータを取得する2つのConfigクラスを作成しました。異なるユーザーがパラメーターを構成できます。

wechat:
  wxurl: https://api.weixin.qq.com/sns/jscode2session?
  appid: wxabc2f8828c8e0049
  appsecret: cec2412a3af99200f4573c337715329a
  granttype: authorization_code
  redis:
    expire: 7200
    wxtoken: wx_token_%s
spring:
  redis:
    port: 6379
    host: 192.168.192.132

上記のパラメーターをコンポーネントで構成可能なものとして使用しました。実際には、それらのいくつかはデフォルトとして使用できますが、当面は変更されていません。使用する場合は、当面はすべて必須です。

プロジェクトディレクトリ

画像の説明
構成パッケージは、構成パラメーターの読み取りです。

utilsパッケージは、Httpを保存するためのリクエストツールです。

コアはWechatTemplateクラスです。

ビジネスによると、次のメソッドが必要です。

アプレットから渡されたコードに従ってopenidを取得する

/**
 * 获取OpenId
 * @param code 微信code
 * @return {@link Map}
 */
public Map<String,String> getOpenId(String code){
    Map<String,String> back = new HashMap<>();
    Map<String,String> wxResult = new HashMap<>();
    String wxLoginUrl = weChatComponent.url(code);
    String result = HttpServiceUtils.sendGet(wxLoginUrl);
    if (result.isEmpty()){
        back.put("null","null");
    }else{
        wxResult = (Map) JSON.parse(result);
        if (wxResult.containsKey("errCode")){
            //存在错误码
            back.put("errCode",wxResult.get("errCode"));
        }else{
            //不存在错误码
            String session_key = wxResult.get("session_key");
            back.put("session_key",session_key);
            log.info("【微信Token】session_key:"+session_key);
            String openid = wxResult.get("openid");
            back.put("openid",openid);
        }
    }
    return back;
}

openidによると、データベースに接続してユーザーIDを取得し、独自のトークンを生成できます

/**
 * 生成Token
 * @param userid 用户id
 * @return {@link String}
 */
public String granToken(String userid){
    return saveToRedis(userid);
}

/**
 * 获取Token并存放到redis中
 * @param userid 用户id
 * @return {@link String}
 */
private String saveToRedis(String userid) {
    String token = UUID.randomUUID().toString();
    Integer expire = redisComponent.getExpire();
    redisTemplate.opsForValue().set(String.format(redisComponent.getWxtoken(),token),userid,expire, TimeUnit.SECONDS);
    return token;
}

存在するかどうかにかかわらず、確認トークンもあります

/**
 * 校验是否存在用户信息
 * @param token 唯一值
 * @return {@link Boolean}
 */
public boolean verifyToken(String token){
    String tokenValue = redisTemplate.opsForValue().get(String.format(redisComponent.getWxtoken(),token));
    if (tokenValue.isEmpty()){
        return false;
    }
    return true;
}

Mavenパッケージ

次に、パッケージ化してMaven中央倉庫に送信し、独自のMavenパッケージを生成します

<dependency>
  <groupId>com.github.UncleCatMySelf</groupId>
  <artifactId>wechat-login</artifactId>
  <version>2.1.0</version>
</dependency>

使い方

Githubプロジェクトでデモを行いました。

画像の説明画像の説明

Serviceを呼び出し、対応するメソッドを使用するだけです。

@Slf4j
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private WechatTemplate wechatTemplate;

    @Autowired(required = true)
    private ResultVOUtil resultVOUtil;

    @Override
    public ResultVo getToken(String code) {
        Map<String,String> result = wechatTemplate.getOpenId(code);
        if (result.containsKey("null")){
            return resultVOUtil.error(555,"返回值为空");
        }else if(result.containsKey("errCode")){
            return resultVOUtil.error(666,"存在错误码,内容:"+result.get("errCode"));
        }else{
            String sessionKey = result.get("session_key");
            String openid = result.get("openid");
            log.info("openid="+openid+"--sessionKey="+sessionKey);
            //与存在用户的openid信息进行对比,返回用户id,不存在则注册用户
            String userid = "WX_10agg";//模拟获取到的用户id
            String token = wechatTemplate.granToken(userid);
            return resultVOUtil.success(token);
        }
    }

    @Override
    public ResultVo verifyToken(String token) {
        return resultVOUtil.success(wechatTemplate.verifyToken(token));
    }
}
ヒント:スキャンパッケージパス@ComponentScan({"com.github.unclecatmyself"})を必ず追加してください

GitHub

Wechat-loginは
、フロントエンドおよびバックエンドコンポーネント(トークンフォーム)であり、フロントエンドアプレットコードを使用してアプレットログインと連携します。


画像の説明

おすすめ

転載: www.cnblogs.com/baimeishaoxia/p/12687205.html