1. 获取授权码
GET:
response_type 必须为 code;
_client_id_=分配的Authentication Keys里的Client ID;
_redirect_uri_=配置的Authorized Redirect URLs里面的一个;
state 为自己设定的一个难以猜测的唯一String,用于下一步获取code的验证,防止CSRF(跨域请求伪造);
_scope_(可选项) 如下图,获取用户应用权限,每个权限之间用空格分开,e.g. scope=r_fullprofile%20r_emailaddress%20w_share;
2. 跳转LinkedIn验证对话框并获取Authorization Code
对话框中会显示你的头像和邀请你的站点的信息(你可以在“应用配置中心”里配置显示头像),并且下面会列出此站点即将获取你的权限信息(对应1种的scope),如果Cancel则直接跳转到redirect_uri地址,如果Allow access则同样跳转到redirect_uri,但同时在URL里会返回给你用于下一步交换Access Token的 Authorization Code和之前GET请求里的state:
e.g.
state 为1中提交的state,因此为了防止CSRF,首先进行验证两步的state是否相同,如果相同则进行下一步,不同则返回401;
code 为 OAuth 2.0的授权码,用于下一步获取Access Token,值得注意的是,这个Authorization Code的生命周期非常短,因此需要及时进行第3部获取Access Token的请求,一旦失效则必须重新获取Authorization code,也就是重新从第1步开始从头来过;
3. 用Authorization Code交换Access Token
POST:
https://www.linkedin.com/uas/oauth2/accessToken
Host=www.linkedin.com
Content-Type=application/x-www-form-urlencoded
Body=grant_type=authorization_code&code=AQSg_Mwsus1ETr0jeFbBoIQ4J5Qk6FkI4XgcpFn397KX5KVNjEpBU2xDUZRN8YWaU1cuEam_Tz_LxlcmqVz-CC7PcO-cjAIT1GB7cM6MhmXbQFZ1cuM&redirect_uri=http://192.168.31.210:3001/callback&client\_id=75m3fi6kmh3k3z&client\_secret=O9NZoX...
grant_type 必为authorization_code;
_code_=2中Authorization Code;
_redirect_uri_、_client_id_和_client_secret_同上;
RESPONSE:
{"access_token":"AQUsEOvGE5HM7XncT57bhQBgcQy_GwfQMPEpjV_bz9rxVtdwGuJSVFtLlBWTB60XcHHLDFIH66i_QJ5Uf5nqs1KP9rG5kvNh9HUCmsBOWuJJaXBjQkY1-CtcDSQrpCNRU868W1rDM-c6Jop6Fn1NROeBUN3JT48K_KbaabW3lD8kvzA_oi8","expires_in":5183999}
Finally,我们终于拿到了我们所需要的Access Token以及其有效时间(一般为60天);
4. 通过Access Token获取用户信息
GET:
- _oauth2_access_token_为3中所获取的
RESPONSE:
- _
_为此用户在这个Application中的唯一识别码,除非换Application,不然此id和用户绑定;
PS:为了保护用户的数据安全,LinkedIn没有提供超长有效期的Access Token,因此我们程序必须有一个在每个用户的Access Token失效之前重新获取(refresh)新的Access Token的机制,以免用户又再走一遍上面的流程。重新获取的方式依然和上面的步骤一样,只是LinkedIn会直接跳过其验证对话框立即返回Authorization Code,而我们则可以直接refresh所需要的Access Token。