AuthWeiboRequest.java 3.7 KB
Newer Older
智布道's avatar
智布道 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
package me.zhyd.oauth.request;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.exception.AuthException;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthSource;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.model.AuthUserGender;
import me.zhyd.oauth.utils.AuthConfigChecker;
import me.zhyd.oauth.utils.IpUtils;
import me.zhyd.oauth.utils.StringUtils;
import me.zhyd.oauth.utils.UrlBuilder;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
 * @version 1.0
 * @website https://www.zhyd.me
 * @date 2019/1/31 16:31
 * @since 1.8
 */
public class AuthWeiboRequest implements AuthRequest {

    @Override
30
    public void authorize(AuthConfig config, HttpServletResponse response) {
智布道's avatar
智布道 已提交
31 32 33
        if (!AuthConfigChecker.isSupportedWeibo()) {
            throw new AuthException(ResponseStatus.UNSUPPORTED);
        }
34
        String authorizeUrl = UrlBuilder.getWeiboAuthorizeUrl(config.getClientId(), config.getRedirectUri());
智布道's avatar
智布道 已提交
35 36 37 38 39 40 41 42
        try {
            response.sendRedirect(authorizeUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
43
    public String authorize(AuthConfig config) {
智布道's avatar
智布道 已提交
44 45 46
        if (!AuthConfigChecker.isSupportedWeibo()) {
            throw new AuthException(ResponseStatus.UNSUPPORTED);
        }
47
        return UrlBuilder.getWeiboAuthorizeUrl(config.getClientId(), config.getRedirectUri());
智布道's avatar
智布道 已提交
48 49 50
    }

    @Override
51
    public AuthResponse login(AuthConfig config, String code) {
智布道's avatar
智布道 已提交
52 53 54 55 56 57
        if (!AuthConfigChecker.isSupportedWeibo()) {
            return AuthResponse.builder()
                    .code(ResponseStatus.UNSUPPORTED.getCode())
                    .msg(ResponseStatus.UNSUPPORTED.getMsg())
                    .build();
        }
58
        String accessTokenUrl = UrlBuilder.getWeiboAccessTokenUrl(config.getClientId(), config.getClientSecret(), code, config.getRedirectUri());
智布道's avatar
智布道 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
        HttpResponse response = HttpRequest.post(accessTokenUrl).execute();
        String accessTokenStr = response.body();
        JSONObject accessTokenObject = JSONObject.parseObject(accessTokenStr);
        if (accessTokenObject.containsKey("error")) {
            return AuthResponse.builder()
                    .code(500)
                    .msg("Unable to get token from gitee using code [" + code + "]")
                    .build();
        }
        String accessToken = accessTokenObject.getString("access_token");
        String uid = accessTokenObject.getString("uid");
        response = HttpRequest.get(UrlBuilder.getWeiboUserInfoUrl(uid, accessToken))
                .header("Authorization", "OAuth2 " + accessToken)
                .header("API-RemoteIP", IpUtils.getIp())
                .execute();
        String userInfo = response.body();
        JSONObject object = JSONObject.parseObject(userInfo);
        return AuthResponse.builder()
                .data(AuthUser.builder()
                        .username(object.getString("name"))
                        .avatar(object.getString("profile_image_url"))
                        .blog(StringUtils.isEmpty(object.getString("url")) ? "https://weibo.com/" + object.getString("profile_url") : object.getString("url"))
                        .nickname(object.getString("screen_name"))
                        .location(object.getString("location"))
                        .remark(object.getString("description"))
                        .gender(AuthUserGender.getRealGender(object.getString("gender")))
                        .source(AuthSource.GITHUB)
                        .build())
                .build();
    }
}