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
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
 */
27 28 29 30 31
public class AuthWeiboRequest extends BaseAuthRequest implements AuthRequest {

    public AuthWeiboRequest(AuthConfig config) {
        super(config);
    }
智布道's avatar
智布道 已提交
32 33

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

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

    @Override
55
    public AuthResponse login(String code) {
智布道's avatar
智布道 已提交
56 57 58 59 60 61
        if (!AuthConfigChecker.isSupportedWeibo()) {
            return AuthResponse.builder()
                    .code(ResponseStatus.UNSUPPORTED.getCode())
                    .msg(ResponseStatus.UNSUPPORTED.getMsg())
                    .build();
        }
62
        String accessTokenUrl = UrlBuilder.getWeiboAccessTokenUrl(config.getClientId(), config.getClientSecret(), code, config.getRedirectUri());
智布道's avatar
智布道 已提交
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 90 91 92 93
        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();
    }
}